【问题标题】:web api 2 ExceptionHandlerFilter OnExceptionAsync not firedweb api 2 ExceptionHandlerFilter OnExceptionAsync 未触发
【发布时间】:2015-10-18 21:20:51
【问题描述】:

我经过 6 年的开发后的第一个问题,所以……大家好。 我到处搜索有关此主题的信息,但没有任何帮助。

我已将控制器的所有方法从同步转移到异步。在一切正常之前,当抛出异常时,会触发 OnException 方法。

现在,当异步控制器方法中引发异常时,无法触发 OnException 或 OnExceptionAsync 方法。

这是我的代码

  public class ExceptionHandlerFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        var resp = new HttpResponseMessage();
        resp.Content = new StringContent(context.Exception.Message + Environment.NewLine + Environment.NewLine + context.Exception.StackTrace);

        if (context.Exception is NotImplementedException)
            resp.StatusCode = HttpStatusCode.NotImplemented;
        else if (context.Exception is NotFoundException)
            resp.StatusCode = HttpStatusCode.NotFound;
        else if (context.Exception is ArgumentException)
            resp.StatusCode = HttpStatusCode.BadRequest;
        else
            resp.StatusCode = HttpStatusCode.InternalServerError;

        context.Response = resp;
    }

    public override Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
    {
        var task = base.OnExceptionAsync(context, cancellationToken);
        return task.ContinueWith((t) =>
        {
            var resp = new HttpResponseMessage();
            resp.Content = new StringContent(context.Exception.Message + Environment.NewLine + Environment.NewLine + context.Exception.StackTrace);

            if (context.Exception is NotImplementedException)
                resp.StatusCode = HttpStatusCode.NotImplemented;
            else if (context.Exception is NotFoundException)
                resp.StatusCode = HttpStatusCode.NotFound;
            else if (context.Exception is ArgumentException)
                resp.StatusCode = HttpStatusCode.BadRequest;
            else
                resp.StatusCode = HttpStatusCode.InternalServerError;

            context.Response = resp;
        });
    }        
}

这是我的控制器

[ExceptionHandlerFilter]
public class FascicolazioneController : ApiController
{      

    [ActionName("ClassificaFascicolaArchivisticamente")]
    [HttpPost]
    public async void ClassificaFascicolaArchivisticamente(string progressivoAnnuo, string archivio, int fascicoloId, string classificazione)
    {
        try
        {
            throw new NotImplementedException();
        }
        catch (Exception ex)
        {
            throw ex;
        }

        using (var client = new Cad.BDI.Archiflow.FacadeArchiflow("SUPER", this.GetTypeAndMethodName()))
        {


            await Task.Factory.StartNew(() => client.ClassificaFascicolaArchivisticamente(
                ProgressivoAnnuo.Parse(progressivoAnnuo), archivio, fascicoloId, Classificazione.Parse(classificazione)));
        }
    }

我尝试在 WebApiConfig 和/或 global.asax 中设置正确的代码行,添加 ExceptionHadlerFilter 而不是仅在控制器上设置属性,但没有任何帮助

【问题讨论】:

  • 在创建回复后尝试将呼叫转移到 base.OnExceptionAsync。另外,不要使用ContinueWith,如果需要使用async-await。将缩短您的代码并使其更具可读性。
  • 谢谢,但它不起作用。奇怪的是,当同步控制器方法出现异常时,会触发 OnExceptionAsync !但是异常过滤器类上的异步控制器方法不会触发任何内容。不明白为什么......

标签: c# asynchronous asp.net-web-api error-handling async-await


【解决方案1】:

多亏了这篇文章,我明白了

https://msdn.microsoft.com/en-us/magazine/jj991977.aspx?f=255&MSPPError=-2147217396

问题在于控制器方法的签名。从不使用

    public async void Bla(){}

我应该使用

   public async Task Bla(){}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多