2016-10-10 35 views
8

Tôi đã hợp nhất một số ứng dụng web của mình thành một dự án ASP.NET MVC chính; chỉ định một số người trong số họ để tách các khu vực, để họ có thể được truy cập thông qua các tên miền phụ.Vùng ASP.NET MVC có thể hiển thị bộ trang lỗi của riêng mình không?

Sử dụng tài nguyên (khá hữu ích) này (https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging), tôi đã thiết lập customErrorshttpErrors trong Web.config, để các trang lỗi tùy chỉnh được hiển thị. Hoạt động tốt.

Tôi sẽ sử dụng bố cục/kiểu dáng khác nhau cho mỗi Khu vực/tên miền phụ, vì vậy tôi tự hỏi: Làm cách nào để có được Vùng hiển thị bộ trang lỗi của riêng mình?

Với thiết lập hiện tại, tất cả các tên miền phụ sẽ hiển thị bộ lỗi tùy chỉnh chính được thêm vào các phần customErrorshttpErrors (403.html, 404.html, v.v ..); nhưng tôi thích các trang lỗi được điều chỉnh cho một số tên miền phụ. (Nếu một trong những khu vực được dành riêng xử lý bởi một tên miền riêng biệt hoàn toàn, ví dụ, nó sẽ không được thực hiện để phục vụ cho các trang lỗi thông thường.)

Cập nhật: Dưới đây là kịch bản, với mã, như yêu cầu. Cảm ơn Ben Foster, người đã cung cấp hướng dẫn tốt tại đây: http://benfoster.io/blog/aspnet-mvc-custom-error-pages2. Tôi đã đặt mã cho customErrors, nhưng không phải là httpErrors tương ứng ... để nó ra cho ngắn gọn.

<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> 

Đoạn mã trên hoạt động tốt:

  • Nếu tôi tìm đến mục "example.com/does/not/exist", tôi nhận được trang lỗi dự kiến ​​tại ~/404.aspx.
  • Nếu tôi điều hướng đến "example.com/MyArea1/does/not/exist", tôi sẽ tải trang lỗi tùy chỉnh tại ~/Areas/MyArea1/404.aspx.

Thách thức:

Bây giờ tôi muốn một Diện tích (MyArea2) để được phục vụ bởi một miền hoàn toàn riêng biệt (ví dụ exampleOnMyOtherDomain.com), sử dụng HostDomainConstraint (theo khuyến cáo của @TetsuyaYamamoto, trong một bình luận phía dưới). Một liên kết có thể truy cập được thông qua "example.com/MyArea2/validlink" bây giờ sẽ được truy cập theo cách này: "exampleOnMyOtherDomain.com/validlink".

Bây giờ, nếu tôi thử "exampleOnMyOtherDomain.com/does/not/exist", tôi sẽ được phân phối 404 cấp cao nhất (~/404.aspx). Điều này có thể do "MyArea2" không nằm trong đường dẫn nữa nên vị trí có đường dẫn "MyArea2" sẽ không được chọn.

Làm cách nào để có được Khu vực (MyArea2) phục vụ các trang lỗi của riêng mình?

+1

Có thể cài đặt vị trí có thể hữu ích, xem tham chiếu: https://msdn.microsoft.com/en-us/library/ms178692.aspx. Nó có thể chứa nội dung khác nhau bên trong phần tử '' trên mỗi vị trí, cho phép 'customErrors' và' httpErrors' được đặt cho khu vực khác nhau bằng cách chỉ định đường dẫn tương đối của khu vực. –

+0

Cảm ơn @TetsuyaYamamoto; đây là một nhận xét khá hữu ích. Tôi đã thử phần tử 'location' và khi Vùng của tôi là một đường phụ của tên miền chính của tôi (ví dụ: http://example.com/MyArea), phần tử' location' hoạt động khá tốt ('path =" MyArea "')! Nhưng đây là vấn đề: Khi Khu vực của tôi được phân phát hoàn toàn bởi một miền riêng biệt, tôi không thể sử dụng cùng một chiến lược (ví dụ: http://myotherexample.net). – cyrotello

+0

Lỗi nào được hiển thị khi truy cập myotherexample.net? Có lẽ nó nên yêu cầu cấu hình định tuyến bổ sung với 'HostNameContraint' bên trong mô-đun định tuyến Global.asax (cũng bao gồm URL viết lại cho khu vực đó). Ngoài ra, bạn có thể chỉnh sửa câu hỏi của mình để bao gồm khu vực và mã định tuyến. –

Trả lời

6

Dựa trên một số nghiên cứu và các gợi ý hữu ích từ @TetsuyaYamamoto, tôi đã sử dụng chiến lược bên dưới.

Tôi đang xử lý "Application_Error" sự kiện trong Global.asax, sử dụng đoạn mã sau:

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(); 
    } 
} 

điểm cần lưu ý:

  • hostName.Contains("exampleOnMyOtherDomain") nên so sánh tên Host với khu vực tôi quan tâm đến việc xử lý. Tôi sẽ thêm các câu lệnh else...if cho các Khu vực khác;
  • Response.TrySkipIisCustomErrors = true nên ngăn IIS cố gắng xử lý lỗi;
  • Response.StatusCode đặt mã trạng thái thích hợp ('404', '500' ...);
  • Server.Transfer() đọc trong tệp mà tôi muốn hiển thị dưới dạng trang lỗi;
  • Server.ClearError() phải báo hiệu rằng lỗi đã được xử lý.

Tôi muốn customErrors/httpErrors để tiếp tục xử lý các lỗi thường xuyên. Khi thực thi đi qua khối Application_Error mà không bị xử lý (ví dụ: Server.ClearError() không được gọi), customErrors/httpErrors sẽ xử lý lỗi.

Dường như đây là chiến lược phù hợp để xử lý lỗi cho các khu vực được phân phối bởi một tên miền khác.

+1

IMHO chiến lược này đã có thể thực hiện xử lý tên miền riêng biệt cho các trang lỗi tùy chỉnh, tuy nhiên bạn cần phải xem rằng 'TrySkipIisCustomErrors' đã hoạt động đúng cách. Nếu trang chuyển hướng đến trang lỗi sẽ không hoạt động, hãy kiểm tra xem '' có đúng không nếu IIS được đặt ở chế độ tích hợp, xem tham chiếu này: https: // msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx. –

+0

Sẽ làm. Cảm ơn @TetsuyaYamamoto, vì tất cả sự giúp đỡ của bạn! – cyrotello

Các vấn đề liên quan