2016-10-10 2 views
8

Я объединил некоторые из своих веб-приложений в один главный проект ASP.NET MVC; назначая некоторые из них для разделения областей, чтобы к ним можно было получить доступ через субдомены.Может ли ASP.NET MVC Area отображать собственный набор страниц ошибок?

С помощью этого (весьма полезно) ресурс (https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging), я настроил customErrors и httpErrors в Web.config, так что отображаются страницы ошибок. Работает хорошо.

Я буду использовать разные макеты/стиль для области/поддомена, поэтому мне интересно: Как я могу получить Area для отображения собственного набора страниц ошибок?

С текущей настройкой, все субдомены будут отображать основной набор пользовательских ошибок, которые добавляются к customErrors и httpErrors секциям (403.html, 404.html, и так далее); но я бы предпочел настроить страницы ошибок для некоторых поддоменов. (Если одна из областей, исключительно занимается отдельный домен в целом, например, это не будет практичным, чтобы служить обычные страницы ошибок.)

Update: Вот сценарий, с кодом, а просил. Спасибо Бен Фостер, который предложил хорошие рекомендации здесь: http://benfoster.io/blog/aspnet-mvc-custom-error-pages2. Я поместил код для 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 верхнего уровня(). Вероятно, это связано с тем, что «MyArea2» больше не находится на пути, поэтому местоположение с дорожкой «MyArea2» не будет выбрано.

Как я могу получить Area (MyArea2), чтобы обслуживать собственные страницы ошибок?

+1

Возможно, настройки местоположения могут помочь, см. Ссылку: https://msdn.microsoft.com/en-us/library/ms178692.aspx. Он может содержать различный контент внутри элемента '' в каждом месте, позволяя устанавливать 'customErrors' и' httpErrors' для разных областей путем указания относительного пути области. –

+0

Спасибо @TetsuyaYamamoto; это был довольно полезный комментарий. Я попробовал элемент «location», и когда мои области являются подпутью моего основного домена (например, http://example.com/MyArea), элемент 'location' работает очень хорошо (' path = "MyArea" ')! Но вот проблема: когда мой регион обслуживается отдельным доменом вообще, я не могу использовать ту же стратегию (например, http://myotherexample.net). – cyrotello

+0

Какая ошибка отображается при доступе к myotherexample.net? Вероятно, в модуле маршрутизации Global.asax может потребоваться дополнительная конфигурация маршрутизации с помощью «HostNameContraint» внутри модуля маршрутизации Global.asax (также включает переписывание URL-адресов в эту область). Кроме того, вы можете изменить свой вопрос, включив в него код области и маршрутизации. –

ответ

6

Основываясь на некоторых исследованиях и полезных указателях от @TetsuyaYamamoto, я использовал следующую стратегию.

Я обработка «Application_Error» событие в Global.asax, используя следующий код:

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 будет обрабатывать ошибку.

Похоже, что это достойная стратегия обработки ошибок для областей, обслуживаемых другим доменом.

+1

IMHO этой стратегии удалось выполнить разделенную обработку домена для пользовательских страниц ошибок, однако вам нужно следить, чтобы «TrySkipIisCustomErrors» работал правильно. Если страница перенаправления на ошибку области не работает, проверьте, что '' на месте, если IIS установлен в интегрированный режим, см. Эту ссылку: https: // msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx. –

+0

сделаю. Спасибо @TetsuyaYamamoto, за вашу помощь! – cyrotello

Смежные вопросы