2010-09-20 33 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。

相關問題