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
вокруг него любые исключения будут, как обычно, выброшены глобальному обработчику.