【发布时间】:2016-04-15 18:09:41
【问题描述】:
我有一个混合 MVC/Web API 项目,我添加了一个简单的 DelegatingHandler 实现来包装 API 响应。这很好用,但处理程序也被调用以处理对 MVC 控制器的请求。我的理解是 DelegatingHandlers 只为 API 路由调用。
如果重要的话,我正在使用 OWIN 和一些属性路由。 Startup.cs中的相关代码为:
var config = new HttpConfiguration();
// ...
var debugging = HttpContext.Current == null || HttpContext.Current.IsDebuggingEnabled;
config.MessageHandlers.Add(new ApiResponseDelegatingHandler(debugging));
这会导致 API 和 Web 请求都被打包并作为 JSON 发送。将其注释掉可以解决问题,但 API 请求不会被打包。网页上的错误信息是:
未找到与请求 URI 'xxx' 匹配的 HTTP 资源。不 已找到此请求的路由数据。
我尝试强制注册路由的顺序,以便在 Web API 之前添加 MVC 路由,但这没有帮助。
【问题讨论】:
-
我可以使用 ActionFilterAttribute 成功实现这一点,但不能处理错误。
-
您也可以在 MVC 中使用处理程序,我认为这种行为是预期的。您可以做的是验证为给定请求找到的路由是否在您拥有 API 控制器的命名空间中。但是 IMO 你应该拆分这两个项目。
-
动作过滤器确实处理错误,但在堆栈中 - 控制器本身发生的错误。
-
这是一个小项目,我不想拆分它,我过去很后悔这样做,因为它使部署加倍而没有任何好处。无论如何,我可以重现它,这是由于 OWIN,我现在正在等待找出它是否是一个错误。这绝对不是预期的行为,应该只为 API 路由激活消息处理程序。
-
你说得对,我很确定 MVC 也有消息处理程序,一直在学习 asp.net/media/4071077/aspnet-web-api-poster.pdf
标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api