3 votes

Obtenir une réponse d'exception WebApi dans un filtre d'exception

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 :

enter image description here

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 ...

enter image description here

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.

3voto

Hackerman Points 10570

Il vous suffit d'accéder au [System.Web.Http.HttpResponseException] de votre context.Exception . Pour ce faire, et d'après l'image, vous devez right click sur le [System.Web.Http.HttpResponseException] et ajouter un watcher sur celui-ci. Vous obtiendrez ainsi les informations appropriées. casting afin d'extraire les informations de la base de données context .

enter image description here

0voto

Laughing Points 3

T var exceptionData = new ExceptionData { Name = "exception name", Message = "exception message" }; Content = new ObjectContent<ExceptionData>(exceptionData, JsonFormatter),

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X