Windows-Server-2008

如果我手動設置 Response.StatusCode,IIS 將覆蓋我的響應內容

  • December 14, 2016

問題

當我手動將HTTP Status我的響應流設置為404503時,IIS 會呈現股票 IIS 內容/視圖,而不是我的自定義視圖。

當我使用 Web 開發伺服器(AKA. Cassini)執行此操作時,它可以正常工作(即顯示我的內容並且response.statuscode== 我輸入的數據)。

有什麼辦法可以覆蓋這種行為?

如何複製

製作一個預設的 ASP.NET MVC1 Web 應用程序。添加以下路線

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   routes.MapRoute(
       "Default",
       "{*catchall}",
       new { controller = "Home", action = "Index" }
       );

}

現在將 HomeController 的 Index 方法替換為…

[HandleError]
public class HomeController : Controller
{
   public ActionResult Index()
   {
       Response.StatusCode = 404;
       return View();
   }
}

好的 - 找到了答案。正如我所料,IIS 正在劫持我的非 200 響應。不確定(即,我不確定這是否是預設行為,或者是因為在機器配置中更新了團隊成員之一的設置,等等……)。

無論如何,這裡的關鍵是告訴 IIS不要處理任何非 200 狀態結果資源。

如何?web.config 中的配置條目。

<system.webServer>
   <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
   .... snipped other IIS relevant elements ... 
</system.webServer>

現在,這裡的關鍵是existingResponse="PassThrough"。如果 HTTP 狀態碼 != 200,那個壞男孩會告訴 IIS 不理會我的資源。

想要更多資訊?當然:在官方 IIS 網站上閱讀有關此元素的更多資訊

引用自:https://serverfault.com/questions/123729