【问题标题】:System.Format Exception throw by SendAsync method of Delegate handler委托处理程序的 SendAsync 方法引发 System.Format 异常
【发布时间】:2018-03-21 17:29:23
【问题描述】:

在使用自定义消息处理程序时,我一直在 API 服务器端遇到以下错误:

API 控制器:-

[RoutePrefix("errors")]
public class ErrorController : ApiController
{
    [HttpGet]
    [Route("{id}")]
    public IHttpActionResult GetClientEmailId(int id)
    {
        return this.Ok();
    }
}

自定义消息处理程序:-

  public class ApiMessageHandler: DelegatingHandler
     {
    protected override async Task<HttpResponseMessage> 
     SendAsync(HttpRequestMessage request, CancellationToken 
       cancellationToken)
    {
        var logger = LogManager.GetLogger(this.GetType().FullName);
        if (logger.IsDebugEnabled)
        {
            var requestMessage = await 
               request.Content.ReadAsByteArrayAsync();

            var resTask = base.SendAsync(request, 
                           cancellationToken).ContinueWith(
                    t =>
                        {
                            if (t.Exception != null)
                            {
                                throw t.Exception;
                            }

                            return t.Result;
                    },
               cancellationToken);

            byte[] responseMessage;

            if (resTask.Result.IsSuccessStatusCode)
            {
                responseMessage = resTask.Result.Content != null
                                      ? await resTask.Result.Content.ReadAsByteArrayAsync()
                                      : Encoding.UTF8.GetBytes(resTask.Result.ReasonPhrase);
            }
            else
            {
                responseMessage = Encoding.UTF8.GetBytes(resTask.Result.ReasonPhrase);
            }

            await this.Log(request, requestMessage, resTask.Result, 
          responseMessage, logger);
            return resTask.Result;
        }

        var response = await base.SendAsync(request, cancellationToken);

        return response;
    }

当我调用操作方法http://localhos:4200/errors/adf(pass 字符串参数而不是整数)然后我在 Base.SendAsync 方法中得到 System.FormatException。 引发异常:mscorlib.dll 中的“System.FormatException” 附加信息:输入字符串的格式不正确。

但是这个异常不是由 GlobalException Handler 处理的。

看起来 base.SendAsync 方法已经吞下了这个异常。 我们如何处理这个异常并重新抛出,以便 GlobalException 处理程序可以用正确的消息处理这个异常。

提前谢谢你。

【问题讨论】:

  • 当使用异步方法时,您需要以异步方式处理错误,因为异常将被它运行的线程有效地吞噬。在这里检查; stackoverflow.com/questions/12980712/…
  • 据我所知,有 async/await 和 Task/ContinueWith 方法的混合。你真的需要 ContinueWith() 吗?谁负责捕捉里面抛出的异常?

标签: c# asp.net-web-api exception-handling message-handlers


【解决方案1】:

问题是你自己吞下了异常。你不是await正在执行任务:

if (resTask.Result.IsSuccessStatusCode)

在 99% 的情况下,这是一种不好的做法,因为您是在同步阻塞线程而不是异步等待结果。你的代码应该是:

var result = await base.SendAsync(request, cancellationToken));
byte[] responseMessage;

if (result.IsSuccessStatusCode)

由于您的方法周围没有try-catch,因此任何异常都会像往常一样被抛出到全局处理程序。

【讨论】:

  • 感谢您的回复。以前我尝试过相同的代码,但它也不起作用。它也没有调用全局处理程序。但是当我们在 base.SendAsync 方法之后抛出一个明确相同的异常时,全局处理程序就可以正常工作了。
  • @user3352289 这可能是DelegatingHandler 是如何声明的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多