【问题标题】:First Web API request triggers execution of Application_Start第一个 Web API 请求触发 Application_Start 的执行
【发布时间】:2015-05-29 07:43:40
【问题描述】:

我有一个还集成了 Web API 的 Web 应用程序。就在今天,我惊讶地发现 Web API 上的第一个 REST 请求重新触发了Application_Start 的执行(尽管它在启动网页时已经运行)。在阅读了ASP.NET HttpApplication lifecycleASP.NET Application Life Cycle Overview 之后,REST 请求似乎正在产生一个新的HttpApplication

此外,在 MSDN 上它说:

第一次在应用程序中请求 ASP.NET 页面或进程时,会创建 HttpApplication 类的新实例。但是,为了最大限度地提高性能,HttpApplication 实例可能会被重复用于多个请求。

在我看来,每个请求都可能产生一个新的HttpApplication,因此Application_Start 必须以可重入或幂等的方式编写。这个结论对吗?

在我的具体情况下,我在 Application_Start 中初始化一个日志写入器,第二次失败,因为该文件已被使用。我想在应用程序池回收的情况下,这不是问题,因为资源在两者之间被释放。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-web-api


    【解决方案1】:

    您可以在提供的链接上进一步阅读

    Application_Start 和 Application_End 方法是不代表 HttpApplication 事件的特殊方法。 ASP.NET 在应用程序域的生命周期内调用它们一次,而不是为每个 HttpApplication 实例调用一次。

    所以没有必要以可重入或幂等的方式写Application_Start

    另外Application_Start是不调用关于IIS的回收。当应用程序被 IIS 实际加载时,它会在回收后的第一个请求时调用。

    至于您的错误,请确保您在 Application_End 上处理掉您的记录器,以便释放文件句柄。

    【讨论】:

    • 似乎我的问题是由于在 IIS Express 中从 VS 调试时应用程序是如何启动的。我无法用当前的代码库重现它。
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 2016-06-23
    • 1970-01-01
    • 2012-03-12
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多