【发布时间】:2018-03-21 17:29:23
【问题描述】:
在使用自定义消息处理程序时,我一直在 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 字符串参数而不是整数)然后我在 Base.SendAsync 方法中得到 System.FormatException。 引发异常:mscorlib.dll 中的“System.FormatException” 附加信息:输入字符串的格式不正确。
但是这个异常不是由 GlobalException Handler 处理的。
看起来 base.SendAsync 方法已经吞下了这个异常。 我们如何处理这个异常并重新抛出,以便 GlobalException 处理程序可以用正确的消息处理这个异常。
提前谢谢你。
【问题讨论】:
-
当使用异步方法时,您需要以异步方式处理错误,因为异常将被它运行的线程有效地吞噬。在这里检查; stackoverflow.com/questions/12980712/…
-
据我所知,有 async/await 和 Task/ContinueWith 方法的混合。你真的需要 ContinueWith() 吗?谁负责捕捉里面抛出的异常?
标签: c# asp.net-web-api exception-handling message-handlers