【问题标题】:When does HttpRequest get created?什么时候创建 HttpRequest?
【发布时间】:2012-03-25 08:24:32
【问题描述】:

在我的 MVC Web 应用程序中,我正在检查 Request.IsLocal 以查看应用程序是否在我的机器上运行——如果是,我设置一个全局静态变量,它告诉我的应用程序的其余部分我在 '调试模式”。

问题是,我不知道什么时候做这个检查。

我尝试在 global.asax.cs 文件中的 Application_Start() 下执行此操作,如下所示:

protected void Application_Start()
{
    if (Request.IsLocal)
        isDebug = true;

    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}

问题是,Request 对象还没有被初始化。我得到一个 HttpException,上面写着

传入的请求不匹配任何路由

所以,我的问题是 Request 对象何时被初始化,是否有某种事件我可以处理以便在 Request 对象准备好后运行此检查?

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-routing global-asax


【解决方案1】:

检查System.Environment.MachineName 可能是更好的方法。

【讨论】:

  • +1。将机器列表添加到 Web.config 并对其进行检查可能会使其更加灵活。
【解决方案2】:

Application_Start() 在 MVC 站点的应用程序池启动时触发。它并不真正了解“请求”对象。因此,即使这是在应用程序范围内设置某些内容的正确位置,您也无法使用 Request.IsLocal 进行设置。您将不得不使用不同的策略。 @Jason 建议使用机器名是一个不错的选择。

如果您想为每个请求检查Request.IsLocal,请为 global.asax 中的 Application_BeginRequest 方法编写一个处理程序。请参阅this 了解更多信息。

【讨论】:

  • Jason 和 dotjoe 提供了极好的想法,但您的回答让我明白了何时应该访问请求对象。
【解决方案3】:

也许使用 web.config 调试模式来确定这一点?

https://stackoverflow.com/a/542896/40822

【讨论】:

    【解决方案4】:

    Request 和 HttpContext.Current 是根据请求创建的(它也可能看起来像单例对象,但实际上并非如此)。因此,如果您想设置应用程序范围的配置 - Application_Start 是正确的位置,但您不会在那里有请求对象(即使您认为它是错误的位置,因为请求不一定来自同一台机器)。

    【讨论】:

      【解决方案5】:

      检查bool isLocal = HttpContext.Current.Request.IsLocal;,但不在Application_Start

      可能有帮助:Global ASAX - get the server name

      【讨论】:

        猜你喜欢
        • 2019-06-13
        • 2014-02-07
        • 2011-01-11
        • 2013-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多