0

J'ai essayé de faire fonctionner un filtre d'exception simplement en renvoyant un 404. Malheureusement, il ne semble pas retourner un 404 du tout, mais il jette 500.ASP.NET Core 1.0 Filtre d'exception ne peut pas le faire retourner 404

API Controller:

[HttpGet("{id}")] 
[ItemNotFoundExceptionFilter] 
public async Task<IActionResult> Get(int id) 
{ 
    var _service = new CustomExeptionService(); 
    _service.ThrowItemNotFoundException(); 
    return Ok(); 
} 

service d'exception personnalisée:

public class CustomExeptionService 
{ 
    public void ThrowItemNotFoundException() 
    { 
     throw new ItemNotFoundException("This is a custom Exception."); 
    } 
} 

public class ItemNotFoundException : Exception 
{ 
    public ItemNotFoundException(string message) : base(message) { } 
    public ItemNotFoundException(string message, Exception ex) : base(message, ex) { } 
} 

Exception Filtre Attribut:

public class ItemNotFoundExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     HandleCustomException(context); 
     base.OnException(context); 
    } 

    private void HandleCustomException(ExceptionContext context) 
    { 
     if (context.Exception.GetType() == typeof(ItemNotFoundException)) 
     { 
      context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound; 
     } 
    } 
} 

enter image description here

+0

Si vous placez un point d'arrêt dans votre méthode 'OnException', est-il jamais appelé? – krillgar

+0

Oui OnException est en effet appelé. En fait HandleCustomException est également appelé et il entre dans le if. 'context.HttpContext.Response.StatusCode' est également réglé correctement sur un 404 mais dans ma réponse à travers le web, je vois toujours un 500 et non un 404. – allencoded

Répondre

0

J'ai eu le même problème aujourd'hui. Je pense que votre code fonctionnera, si vous effacez l'exception. Exemple:

public override void OnException(ExceptionContext context) 
    { 
     if (context.Exception.GetType() == typeof(TokenExpiredException)) 
     { 
      context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
      context.Exception = null; 
     } 

     base.OnException(context); 
    }