我们安装了一个例外过滤器
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
参数中。
答案 0 :(得分:3)
您只需访问[System.Web.Http.HttpResponseException]
中的context.Exception
即可。为了做到这一点,并根据图片,您需要在right click
上[System.Web.Http.HttpResponseException]
并在其上添加watcher
。这将为您提供适当的casting
,以便从context
中检索信息。
答案 1 :(得分:0)
试试这个
var exceptionData = new ExceptionData
{
Name = "exception name",
Message = "exception message"
};
Content = new ObjectContent<ExceptionData>(exceptionData, JsonFormatter),