【问题标题】:Why is my DelegatingHandler firing for MVC requests?为什么我的 DelegatingHandler 会触发 MVC 请求?
【发布时间】: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


【解决方案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;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2021-03-07
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多