System.Format异常抛出Delegate处理程序的SendAsync方法

时间:2017-10-10 10:30:33

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

使用自定义消息处理程序时,我在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;
    }

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

但GlobalException Handler不会处理此异常。

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

提前谢谢。

1 个答案:

答案 0 :(得分:2)

问题是你自己吞下了这个例外。你不是await任务:

if (resTask.Result.IsSuccessStatusCode)

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

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

if (result.IsSuccessStatusCode)

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