Мы установили 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
}
}
}
Таким образом, если неавторизованный пользователь нажимает маршрут, который требует от него быть авторизованы, мы бросаем. Если я отладить внутри этого фильтра и открыть диалоговое окно исключения можно увидеть следующие свойства на объект исключения:
Если я смотрю на Response
опору я вижу, все соответствующие детали, за исключением брошенной.
Проблема в том, когда это исключение обрабатывается APIErrorHandlerAttribute
. К тому времени, исключение попадет в обработчик я не могу показаться, чтобы найти Response
свойства исключения в context.Exception
...
Несмотря на то, обработчике я получаю следующее сообщение об ошибке от исключение:
Обработка запроса HTTP привела к исключению. Подробнее см. Ответ HTTP, возвращенный свойством «Ответ» этого исключения.
, подразумевающий, что исключение в контексте должно иметь это свойство.
Я чувствую, что у меня возникают проблемы с областью видимости и что исходный объект исключения, который был выброшен в фильтр, не находится в параметре context
обработчика исключений.
А если нажать на значок plus' 'на' [System.Web.Http.HttpResponseException] '? – Hackerman
@Хакерман Вот и все! Теперь, как мне получить доступ к '[System.Web.Http.HttpResponseException]' из 'context.Exception'? – seebiscuit
Просто щелкните правой кнопкой мыши и добавьте еще один вахту. Это даст вам подходящее кастинг, чтобы получить информацию из контекста :) – Hackerman