System.Format Исключение, генерируемое методом SendAsync обработчика Delegate

При использовании пользовательского обработчика сообщений я продолжаю сталкиваться со следующей ошибкой на стороне сервера 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 строковый параметр вместо целого), я получил System.FormatException в методе Base.SendAsync. Возникло исключение: "System.FormatException" в mscorlib.dll Дополнительная информация: входная строка была в неправильном формате.

Но это исключение не обрабатывается обработчиком GlobalException.

Похоже, что метод base.SendAsync поглотил это исключение. Как мы можем обработать это исключение и повторно обработать, чтобы обработчик GlobalException мог обработать это исключение с правильным сообщением.

Заранее спасибо.

1 ответ

Проблема в том, что вы сами проглатываете исключение. Ты не awaitВ задаче:

if (resTask.Result.IsSuccessStatusCode)

Это плохая практика в 99% случаев, так как вы синхронно блокируете поток, а не асинхронно ожидаете результата. Ваш код должен быть:

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

if (result.IsSuccessStatusCode)

Так как ваш метод не имеет try-catch вокруг него любые исключения будут, как обычно, выброшены глобальному обработчику.

Другие вопросы по тегам