1

在使用自定义消息处理程序时,我一直在 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(传递字符串参数而不是整数)时,我在 Base.SendAsync 方法中得到了 System.FormatException。引发异常:mscorlib.dll 中的“System.FormatException”附加信息:输入字符串的格式不正确。

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

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

先感谢您。

4

1 回答 1

2

问题是你自己吞下了异常。你没有await完成任务:

if (resTask.Result.IsSuccessStatusCode)

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

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

if (result.IsSuccessStatusCode)

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

于 2017-10-10T10:38:26.283 回答