捕获路由错误

时间:2013-01-17 18:39:41

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

我正在构建一个RESTful API,我想控制所有可能的输出给我的消费者。我正在实现ExceptionFilterAttribute来过滤控制器中引发的所有异常。但是,这并不能让我控制在到达控制器代码之前我的应用程序中可能发生的错误 - 例如路由错误。默认行为发回标准的序列化HttpError,给出了太多内部信息,比如控制器类名等。我想避免这种情况。改变这种行为的最佳方法是什么?

2 个答案:

答案 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的建议,并使用消息处理程序拦截响应以发送回您喜欢的任何内容。