为什么我的DelegatingHandler会为MVC请求触发?

时间:2016-04-15 18:09:41

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

我有一个混合的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匹配的HTTP资源' xxx'。没有   找到了此请求的路由数据。

我尝试强制注册路由的顺序,以便在Web API之前添加MVC路由但没有帮助。

1 个答案:

答案 0 :(得分:1)

这很容易重现,我不确定它是否是一个错误。

  • 使用ASP.NET MVC模板创建新的Web应用程序
  • 安装Microsoft.AspNet.WebApi.Owin和 Microsoft.Owin.Host.SystemWeb NuGet包
  • 将Web API启动从WebApiConfig.cs移至新的Startup.cs文件
  • 创建DelegatingHandler并将其添加到Startup类中的config.MessageHandlers
  • 将为MVC和API请求调用DelegatingHandler

我在Startup.cs和WebApiConfig.cs中尝试了几种初始化的组合但没有成功。如果您;不使用属性路由,解决方案是将处理程序添加到路由。如果你是,我找到的唯一解决方法是检查处理程序中的路由,如果路由以" / api /"开头,则只包装API响应。

public class WtfDelegatingHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        if (request.RequestUri.LocalPath.StartsWith("/api/", StringComparison.OrdinalIgnoreCase))
        {
            response = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                Content = new StringContent("I'm an API response")
            };
        }

        return response;
    }

}