ASP.NET MVC 區域可以顯示它自己的一組錯誤頁面嗎?
我一直在將我的一些 Web 應用程序整合到一個主要的 ASP.NET MVC 項目中;將其中一些分配到單獨的區域,以便可以通過子域訪問它們。
使用這個(非常有用的)資源(https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging ),我已經在
customErrors,中設置了自定義錯誤頁面顯示。效果很好。httpErrors``Web.config我將為每個區域/子域使用不同的佈局/樣式,所以我想知道: 我怎樣才能讓一個區域顯示它自己的一組錯誤頁面?
使用目前設置,所有子域都將顯示添加到
customErrors和httpErrors部分的主要自定義錯誤集(403.html、404.html 等);但我更喜歡為某些子域定制錯誤頁面。(例如,如果其中一個區域完全由一個單獨的域專門處理,則提供正常錯誤頁面是不切實際的。)更新: 根據要求,這是帶有程式碼的場景。感謝 Ben Foster,他在這裡提供了很好的指導:http: //benfoster.io/blog/aspnet-mvc-custom-error-pages 2。我已經放了 customErrors 的程式碼,但沒有放相應的 httpErrors…為簡潔起見,將其省略。
<system.web> <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx"> <error statusCode="404" redirect="~/404.aspx" /> <error statusCode="500" redirect="~/500.aspx" /> </customErrors> </system.web> <location path="MyArea1"> <system.web> <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Areas/MyArea1/500.aspx"> <error statusCode="404" redirect="~/Areas/MyArea1/404.aspx" /> <error statusCode="500" redirect="~/Areas/MyArea1/500.aspx" /> </customErrors> </system.web> </location> <location path="MyArea2"> <system.web> <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Areas/MyArea2/500.aspx"> <error statusCode="404" redirect="~/Areas/MyArea2/404.aspx" /> <error statusCode="500" redirect="~/Areas/MyArea2/500.aspx" /> </customErrors> </system.web> </location>上面的程式碼執行良好:
- 如果我導航到“example.com/does/not/exist”,我會在
~/404.aspx.- 如果我導航到“example.com/MyArea1/does/not/exist”,我將在
~/Areas/MyArea1/404.aspx.挑戰:
現在我希望一個區域(MyArea2)由一個完全獨立的域(例如exampleOnMyOtherDomain.com)提供服務,使用
HostDomainConstraint(如@TetsuyaYamamoto 所推薦,在下面的評論中)。可以通過“example.com/MyArea2/validlink”訪問的連結現在將以這種方式訪問:“exampleOnMyOtherDomain.com/validlink”。現在,如果我嘗試“exampleOnMyOtherDomain.com/does/not/exist”,我將獲得頂級 404 (
~/404.aspx)。這可能是因為“MyArea2”不再在路徑中,所以路徑為“MyArea2”的位置將不會被拾取。如何讓區域 (MyArea2) 提供自己的錯誤頁面?
根據@TetsuyaYamamoto 的一些研究和有用的指示,我採用了以下策略。
我正在
Global.asax使用以下程式碼處理中的“Application_Error”事件:protected void Application_Error(object sender, EventArgs e) { string hostName = Request.Headers["host"].Split(':')[0]; if (hostName.Contains("exampleOnMyOtherDomain")) { Exception exception = Server.GetLastError(); Response.Clear(); HttpException httpException = exception as HttpException; Response.TrySkipIisCustomErrors = true; switch (httpException.GetHttpCode()) { case 404: Response.StatusCode = 404; Server.Transfer("~/Errors/MyArea2_404.htm"); break; case 500: default: Response.StatusCode = 500; Server.Transfer("~/Errors/MyArea2_500.htm"); break; } Server.ClearError(); } }注意事項:
hostName.Contains("exampleOnMyOtherDomain")應該將主機名與我有興趣處理的區域進行比較。我將添加else...if其他領域的聲明;Response.TrySkipIisCustomErrors = true應該阻止 IIS 嘗試處理錯誤;Response.StatusCode適當地設置狀態碼(‘404’, ‘500’…);Server.Transfer()讀入一個我想顯示為錯誤頁面的文件;Server.ClearError()應該表明錯誤已被處理。我想
customErrors/httpErrors繼續處理正常錯誤。當執行通過Application_Error塊而不被處理(即Server.ClearError()未被呼叫)時,customErrors/httpErrors將處理錯誤。這似乎是處理由不同域提供服務的區域的錯誤的不錯策略。