我正在构建一个RESTful API,我想控制所有可能的输出给我的消费者。我正在实现ExceptionFilterAttribute
来过滤控制器中引发的所有异常。但是,这并不能让我控制在到达控制器代码之前我的应用程序中可能发生的错误 - 例如路由错误。默认行为发回标准的序列化HttpError,给出了太多内部信息,比如控制器类名等。我想避免这种情况。改变这种行为的最佳方法是什么?
答案 0 :(得分:7)
您可以添加MessageHandler
来执行此操作。
MessageHandlers
首先在管道中运行,允许您处理原始传入请求和原始传出响应。
例如:
public class ErrorHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (!response.IsSuccessStatusCode)
{
Debug.WriteLine("something happened! - " + response.ReasonPhrase);
}
return response;
}
}
然后在GlobalConfiguration
config.MessageHandlers.Add(new ErrorHandler());
这基本上检查了传出响应,并检查状态代码是否为2xx。如果没有,你可以用它做点什么 - 记录,或者重置响应的内容以隐藏你想要隐藏的东西。
答案 1 :(得分:3)
实际上,我们一直非常小心,默认情况下不会将内部信息泄露给远程客户端。如果请求来自本地计算机以进行调试,我们将提供内部信息,但我们不会将其发送给远程客户端。如果您想查看远程客户端的响应结果,请在配置中尝试以下设置:
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;
您可能还想查看此博客文章,了解有关WebAPI错误处理的更多信息:
http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx
如果默认设置仍然不适合您,那么您应该遵循Filip的建议,并使用消息处理程序拦截响应以发送回您喜欢的任何内容。