When does HttpRequest get created?

2019-07-16 03:59发布

问题:

In my MVC web application, I'm checking Request.IsLocal to see if the application is running on my machine--if it is, I set a Global static variable which tells the rest of my application that I am in 'Debug Mode'.

The problem is, I don't know when to do this check.

I tried to do it in the global.asax.cs file, under Application_Start(), like this:

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

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

The trouble is, the Request object has not been initialized yet. I get a HttpException which says

The incoming request does not match any route

So, my question is when does the Request object get initialized, and is there an event of some sort that I could handle in order to run this check after the Request object is ready?

回答1:

Application_Start() fires when your MVC site's app pool is spun up. It doesn't really know about the "request" object. So even though this is the correct place to set something application-wide, you won't be able to do it with Request.IsLocal. You'll have to use a different stragegy. @Jason's suggestion of using the machine name is a good option.

If you'd like to check Request.IsLocal for every request, write a handler for method for Application_BeginRequest in global.asax. See this for more info.



回答2:

Checking System.Environment.MachineName is probably a better way to do this.



回答3:

Maybe use the web.config debug mode to determine this?

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



回答4:

Request and HttpContext.Current are created per request (also it may look like singleton object it really is not). So if you want to set application-wide configuration - Application_Start is the right place, but you'll not have request object there (even if you would it is wrong place since requests are not necessary coming from the same machine all the time).



回答5:

Check bool isLocal = HttpContext.Current.Request.IsLocal; but not in Application_Start

It may help: Global ASAX - get the server name