Asp.net-Mvc

ASP.NET MVC 區域可以顯示它自己的一組錯誤頁面嗎?

  • October 18, 2016

我一直在將我的一些 Web 應用程序整合到一個主要的 ASP.NET MVC 項目中;將其中一些分配到單獨的區域,以便可以通過子域訪問它們。

使用這個(非常有用的)資源(https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging ),我已經在customErrors,中設置了自定義錯誤頁面顯示。效果很好。httpErrors``Web.config

我將為每個區域/子域使用不同的佈局/樣式,所以我想知道: 我怎樣才能讓一個區域顯示它自己的一組錯誤頁面?

使用目前設置,所有子域都將顯示添加到customErrorshttpErrors部分的主要自定義錯誤集(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將處理錯誤。

這似乎是處理由不同域提供服務的區域的錯誤的不錯策略。

引用自:https://stackoverflow.com/questions/39967554