Nous avons installé un filtre d'exception
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",
});
}
}
pour toutes les routes 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());
}
Nous avons également un attribut d'autorisation que nous attachons à certains contrôleurs. Il ressemble à quelque chose comme ceci :
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
}
}
}
Ainsi, si un utilisateur non authentifié rencontre une route qui exige qu'il soit connecté, nous lançons un message. Si je débogue à l'intérieur de ce filtre et que j'ouvre la boîte de dialogue d'exception, je peux voir les propriétés suivantes sur l'objet d'exception :
Si je regarde le Response
prop Je vois tous les détails pertinents de l'exception levée.
Le problème est que lorsque cette exception est traitée par APIErrorHandlerAttribute
. Au moment où l'exception arrive au gestionnaire, je n'arrive pas à trouver l'élément Response
de l'exception en context.Exception
...
Même si, au niveau du gestionnaire, j'obtiens le message d'erreur suivant de l'exception capturée :
Le traitement de la requête HTTP a donné lieu à une exception. Veuillez consulter la réponse HTTP renvoyée par la propriété 'Response' de cette exception pour plus de détails.
ce qui implique que l'exception dans le contexte devrait avoir cette propriété.
J'ai l'impression d'avoir des problèmes de portée et que l'objet d'exception original qui a été lancé dans le filtre n'est pas dans le fichier context
du gestionnaire d'exception.