Windows-Server-2008
如果我手動設置 Response.StatusCode,IIS 將覆蓋我的響應內容
問題
當我手動將
HTTP Status
我的響應流設置為404
或503
時,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 網站上閱讀有關此元素的更多資訊。