【问题标题】:Async methods causing 404 errors in app start在应用程序启动中导致 404 错误的异步方法
【发布时间】:2014-10-18 12:08:58
【问题描述】:

我在 global.asax 文件中使用了async 方法,但遇到了问题。

即使 async 方法正常工作,但当我在 Application_Start() 中触发它们时,我的应用程序启动时会出现 404 错误,直到它完成,而它在完成之前不应该完成。

这是我 global.asax 中的代码:

public class MvcApplication : System.Web.HttpApplication
{
    protected async void Application_Start()
    {
        var Init = new Init();
        await Init.LoadAsync();

        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

我在想,因为必须将Application_Start() 设置为async 才能允许await 命令,所以应用程序启动时不会等待Application_Start() 函数本身。因此,有必要找出如何 awaitApplication_Start() 函数或其他方式来触发该方法,而不必将 Application_Start() 设为 async 方法(后者是首选)。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asynchronous async-await


    【解决方案1】:

    ASP.NET 似乎不允许将 aysnc 用于 Application_Start。但是,您可以使用 HttpApplication.AddOnBeginRequestAsync(BeginEventHandler, EndEventHandler) 将异步用于 BeginRequest。有一个标志来指示您的 Init.LoadAsync 是否已被调用,以便您只会在第一个请求时触发初始化。

    然后设置应用程序初始化模块来创建第一个请求。

    http://msdn.microsoft.com/en-us/library/System.Web.HttpApplication_methods%28v=vs.110%29.aspx

    【讨论】:

    • 他们允许它,只是不能覆盖它的调用者。我实际上能够删除 asyncawait,即使我收到警告,它仍然运行。
    • 不等待 LoadAsync 的问题是,当您的 LoadAsync 仍在运行时,请求可能会进入,因此该请求可能会进入未初始化状态。我必须在完成之前验证应用程序初始化模块是否确实阻止了实际请求
    • 我看不出并发请求有什么问题——我的理解是当你不await时它会同步运行
    • 我错了,我现在在未初始化的对象上遇到错误。
    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多