使用自定义消息处理程序时,我在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处理程序可以使用正确的消息处理此异常。
提前谢谢。
答案 0 :(得分:2)
问题是你自己吞下了这个例外。你不是await
任务:
if (resTask.Result.IsSuccessStatusCode)
在99%的情况下,这是一种不好的做法,因为您同步阻塞线程而不是异步等待结果。你的代码应该是:
var result = await base.SendAsync(request, cancellationToken));
byte[] responseMessage;
if (result.IsSuccessStatusCode)
由于您的方法没有围绕它的try-catch
,因此会像往常一样将全局处理程序抛出任何异常。