2016-12-26 2 views
3

Мы установили Exception фильтрПолучение WebAPI Исключительный ответ в фильтр исключений

public class APIErrorHandlerAttribute : ExceptionFilterAttribute, IExceptionFilter 
{ 
    // Sets up log4net logger 
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger 
     (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    public override void OnException(HttpActionExecutedContext context) 
    { 
     if (context.Exception is BusinessException) 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) 
      { 
       Content = new StringContent(context.Exception.Message), 
       ReasonPhrase = "Exception" 
      }); 

     } 

     //Log Critical errors 
     log.Info("/****************** API Begin Error ******************/"); 
     log.Info("Exception:" + context.Exception + " Case:" + CaseHelper.GetCurrentCaseID() + " UserID:" + UserHelper.GetCurrentUserID()); 
     log.Info("/****************** API End Error ******************/"); 

     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) 
     { 
      Content = new StringContent(string.Format("Message: {0}\nStack Trace: {1}", context.Exception.Message, context.Exception.StackTrace)), 
      ReasonPhrase = "Critical Exception", 
     }); 
    } 
} 

для всех WebAPI маршрутов

//*** Log API Error Globally using Log4net 
    public static void RegisterFilters(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute("DefaultApiError", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }); 
     config.Filters.Add(new LRAPIErrorHandlerAttribute()); 
    } 

Мы также имеют атрибут авторизации, который мы придаем некоторым контроллерам. Это выглядит примерно так:

public class LegalRadiusAPIAuthorizationAttribute : ActionFilterAttribute, IActionFilter, IFilter 
{ 
    public string Permissions { get; set; } 
    public string Roles { get; set; } 
    public string Users { get; set; } 

    public override void OnActionExecuted(HttpActionExecutedContext filterContext) 
    { 
     if (!HttpContext.Current.User.Identity.IsAuthenticated) 
     { 
      throw new HttpResponseException(HttpStatusCode.NonAuthoritativeInformation); //203 
     } 
    } 
} 

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

enter image description here

Если я смотрю на Response опору я вижу, все соответствующие детали, за исключением брошенной.

Проблема в том, когда это исключение обрабатывается APIErrorHandlerAttribute. К тому времени, исключение попадет в обработчик я не могу показаться, чтобы найти Response свойства исключения в context.Exception ...

enter image description here

Несмотря на то, обработчике я получаю следующее сообщение об ошибке от исключение:

Обработка запроса HTTP привела к исключению. Подробнее см. Ответ HTTP, возвращенный свойством «Ответ» этого исключения.

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

Я чувствую, что у меня возникают проблемы с областью видимости и что исходный объект исключения, который был выброшен в фильтр, не находится в параметре context обработчика исключений.

+0

А если нажать на значок plus' 'на' [System.Web.Http.HttpResponseException] '? – Hackerman

+0

@Хакерман Вот и все! Теперь, как мне получить доступ к '[System.Web.Http.HttpResponseException]' из 'context.Exception'? – seebiscuit

+0

Просто щелкните правой кнопкой мыши и добавьте еще один вахту. Это даст вам подходящее кастинг, чтобы получить информацию из контекста :) – Hackerman

ответ

3

Вам просто нужно, чтобы получить доступ к [System.Web.Http.HttpResponseException] от вашего context.Exception. Для этого, и на основе рисунка, вам нужно right click на [System.Web.Http.HttpResponseException] и добавить на нем watcher. Это даст вам casting, чтобы получить информацию от context.

enter image description here

0

Попробуйте var exceptionData = new ExceptionData { Name = "exception name", Message = "exception message" }; Content = new ObjectContent<ExceptionData>(exceptionData, JsonFormatter),

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