2010-09-20 50 views
3

我想知道以下几点:asp.net MVC:什么时候IIS给404,什么时候它转发给我的应用程序?

我可以在IIS中定义如何处理page not founds/404做的,也是我的应用程序,我可以把它放在我的CustomErrors部分或只是处理它的代码。

现在,我认为IIS总是首先获取请求,它何时处理404本身,它什么时候让它通过我的应用程序?

另外一个问题:IIS实际上可以知道asp.net MVC中的请求是否是404,因为它可能或者它可能不是我通过任何route映射的?

+0

**想知道为什么我没有在这里得到一个'开始赏金'选项** – Michel 2010-10-04 20:05:12

+0

啊,它在这里:) – Michel 2010-10-05 20:09:21

+0

啊,我做了RTFM,这是因为有另一个赏金活跃,只能有在任何时候都是活跃的 – Michel 2010-10-05 20:10:47

回答

1

IIS查看请求扩展。如果注册了一个模块来处理进入的请求的类型,那么它会将请求转发给该模块。

例如,如果您从服务器请求foo.jpg,那么IIS内置了一个模块来处理image/jpg内容。如果该模块找不到该文件,则返回一个404.

此处同样的事情。无论您的MVC处理程序不查找什么(即:图像),IIS都会以其他方式处理。

1

IIS实际上可以知道asp.net MVC中的请求是否是404,因为它可能是 或者它可能不是我通过任何路由映射的吗?

我认为这一切都取决于您的控制器工厂如何处理未映射的请求。当DefaultController工厂无法找到路由并且让IIS处理错误显示时,似乎会使用代码404抛出HttpException。你可以玩这个游戏,并通过创建你自己的控制器工厂来实现它。

例如,下面的行添加到您的Application_Start

ControllerBuilder.Current.SetControllerFactory(new TestControllerFactory()); 

这个类添加到一个全新的MVC项目:

public class TestControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      //throw new Exception("Oops!");        // yellow screen of death 
      throw new System.Web.HttpException(404, "Oops not found!"); // bubbles up to IIS 
     } 
     return base.GetControllerInstance(requestContext, controllerType); 
    } 
} 

导航到你的项目http://localhost/MvcApplication1/unmapped,看看发生在哪你抛出一个HttpException与404代码相比,当你抛出一个常规的异常(或甚至一个代码404以外的HttpException)

确保您在IIS(而不是VS Dev Server)下运行您的项目,因为它们处理这些不同的事情。

1

现在,我认为IIS总是首先获取请求,它何时处理404本身,它何时让它通过我的应用程序?

尽管请求最初是由ISS处理的,但它传递给了MVC应用程序。如果找不到文件,则会抛出HttpException,将其返回到IIS。如果找到文件,它将直接绕过路由。

但是,您可以通过调整RouteExistingFiles属性来修改行为。如果我没有弄错,但是当属性设置为true(默认为false)时,您将需要创建处理所有静态内容的路径。然而,根据Steve Sanderson的建议,here建议路由系统首先检查文件是否存在于磁盘上。 (请参阅related SO question,其中提供了更好的说明,尤其是评论)。

亲自试一试。使用Global.asax文件中的Application_Error()Application_EndRequest()事件,并检查HttpContext.Current.Response对象以查看提供内容时的最终响应。

和侧问题:可以IIS其实知道,如果在asp.net MVC的请求是404,因为它可能会,也可能不是我通过任何途径映射?

这是路由配置发挥作用的地方。由于MVC将检查文件是否首先存在,如果存在,它将直接得到服务并绕过路由。关于控制者和行为,同样适用。例如。首先检查/SomeController/ActionThatDoesExist以验证它是否是物理文件。很明显,这不是一个文件,应用程序将返回404异常。

第三个方面我认为可能与这个问题有关的是MVC和IIS如何协同工作。我所指的是Integrated ModeClassic Mode。一个真棒解释可以发现here

0

您会希望将执行保留在您的MVC应用程序中,就像其他人所说的那样,通常IIS会先将请求传递给MVC,并且只有当MVC通过404异常时才会将IIS取回并应用它做决定的过程。

的关键是:handle 404's in MVC properly!

1

IIS总是处理请求,然后将它转发到MVC应用程序。这是基本决定如何处理它的地方。

如果它们已经是磁盘上的物理文件,那么整个路由被绕过并且文件被传送。如果找不到该文件,则会尝试与路由匹配。如果什么都行不通,那么MVC应用程序可能会处理404,否则它将引发HTTPException并且IIS处理404.我相信,即使在Webforms中,404场景在内部也几乎相同。唯一不同的是目标始终是一个物理磁盘,但请求仍然会发送到ASP.NET Webforms,因此您需要自己处理404。

相关问题