【发布时间】:2014-03-29 03:04:48
【问题描述】:
我在此示例中面临以下问题:
我在ExceptionContext 中找不到IsOutermostCatchBlock
如果发生异常,这个HandleAsync方法会执行两次。
(http://www.asp.net/web-api/overview/web-api-routing-and-actions/web-api-global-error-handling)
public class CustomExceptionHandler : IExceptionHandler
{
public virtual Task HandleAsync(ExceptionHandlerContext context,
CancellationToken cancellationToken)
{
if (!ShouldHandle(context))
{
return Task.FromResult(0);
}
return HandleAsyncCore(context, cancellationToken);
}
public virtual Task HandleAsyncCore(ExceptionHandlerContext context,
CancellationToken cancellationToken)
{
HandleCore(context);
return Task.FromResult(0);
}
public virtual void HandleCore(ExceptionHandlerContext context)
{
}
public virtual bool ShouldHandle(ExceptionHandlerContext context)
{
return context.ExceptionContext.IsOutermostCatchBlock;
}
}
public class OopsExceptionHandler : CustomExceptionHandler
{
public override void HandleCore(ExceptionHandlerContext context)
{
context.Result = new TextPlainErrorResult
{
Request = context.ExceptionContext.Request,
Content = "Oops! Sorry! Something went wrong." +
"Please contact support@contoso.com so we can try to fix it."
};
}
private class TextPlainErrorResult : IHttpActionResult
{
public HttpRequestMessage Request { get; set; }
public string Content { get; set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response =
new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.Content = new StringContent(Content);
response.RequestMessage = Request;
return Task.FromResult(response);
}
}
}
}
【问题讨论】:
-
我不确定我是否理解您的问题。 HandleAsync 确实被多次调用。这就是为什么有 ShouldHandle 守卫的原因。我不知道你找不到“IsOutermostCatchBlock”是什么意思。您显示的代码是否编译?
-
如果我使用 context.ExceptionContext.CatchBlock.IsTopLevel 表示此代码正在编译。
标签: c# asp.net-web-api