2015-12-10 3 views
2

Я пытаюсь запустить 401 HttpException, но приложение всегда возвращает 500 вместо 401. Этого не происходит, когда я бросаю другую ошибку 4XX.MVC5 throw HttpException of 401 возвращает 500

public ActionResult Error401() 
    { 
     throw new HttpException(401, "Unauthorized"); 
    } 

Я пытаюсь создать пользовательские страницы ошибок для 500, 404, 403, 400 и 401. Для всех ошибок, за исключением 401 я получить правильную страницу, для 401 я получаю в браузере ошибки 500 и 500 пользовательской ошибки стр.

<system.web> 
     <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/CustomErrors/InternalServerError.aspx"> 
      <error statusCode="500" redirect="~/CustomErrors/InternalServerError.aspx" /> 
      <error statusCode="404" redirect="~/CustomErrors/NotFound.aspx" /> 
      <error statusCode="403" redirect="~/CustomErrors/Forbidden.aspx" /> 
      <error statusCode="400" redirect="~/CustomErrors/BadRequest.aspx" /> 
      <error statusCode="401" redirect="~/CustomErrors/Unauthorized.aspx" /> 
     </customErrors> 
    </system.web> 



public class ErrorHandleAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.HttpContext.IsCustomErrorEnabled == false) 
     { 
      return; 
     } 

     object exception = filterContext.Exception; 
     int httpStatusCode = (exception as HttpException).GetHttpCode(); 

     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
     filterContext.HttpContext.Response.StatusCode = httpStatusCode; 
    } 
} 

Любые идеи других решений для возврата правильной пользовательской страницы для 401?

Благодаря

+0

Вы зарегистрированы как пользовательский атрибут ошибки? –

+0

Да, он зарегистрирован, я получаю все страницы с ошибками около 401. – gdi

ответ

0

Вы должны попытаться сделать это

public ActionResult Error401() 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.Forbidden, "Forbidden"); 
} 

Тогда вам не нужно выбрасывать исключение каждый раз, потому что это дороже.

+0

Это, кажется, решение, но оно не будет проходить через мой фильтр ErrorHandle. Он также эквивалентен - возвращает новый HttpStatusCodeResult (HttpStatusCode.Unauthorized, «Unauthorized»); И для возврата пользовательской страницы ошибки ей потребуется дополнительная настройка в web.config в разделе httpErrors (IIS). Мне нужно что-то, что проходит через фильтр ошибок. – gdi

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