捕获路由错误

dev*_*com 5 asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

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

Fil*_*p W 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册你的 GlobalConfiguration

config.MessageHandlers.Add(new ErrorHandler());
Run Code Online (Sandbox Code Playgroud)

这基本上检查了传出响应,并检查状态代码是否为2xx.如果没有,你可以用它做点什么 - 记录,或者重置响应的内容以隐藏你想要隐藏的内容.