路由特定的ASP.NET MVC Web API消息处理程序未调用控制器操作



我有一个ASP.NET MVC Web API控制器:

[HttpPost]
public async Task<HttpResponseMessage> Post(HttpRequestMessage req, CancellationToken cancellationToken) {...}

和我创建的自定义消息处理程序:

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

WebConfigApi.cs中的i将消息处理程序特定于控制器操作方法连接到:

configuration.Routes.MapHttpRoute(
   name: "UpdateStuffAPI",
   routeTemplate: "api/updatestuff/post/{stuffid}",
   defaults: new { feedid = RouteParameter.Optional },
   constraints: null,
   handler: new MyMessageHandler()
);

当我发布到控制器动作方法时,例如:

http://hostname/api/updatestuff/post?stuffid=12345

消息处理程序按预期拦截请求。但是在逐步踏上线路时:

var response = await base.SendAsync(request, cancellationToken);

Controller Action方法永远不会被击中。

作为测试,我删除了特定路线的接线,并使消息处理程序全局:

configuration.MessageHandlers.Add(new MyMessageHandler());

SendAsync正确调用了我的控制器的动作方法。

所以我的想法是路由定义有问题。但是,消息处理程序是通过路由特定的接线来调用的,,路由调试器表明,当我发布到控制器(http://hostname/api/updatestuff/post?stuffid=12345(时,该路线IS 被使用。

当我以特定方式将消息处理程序连接到消息处理程序时,为什么我的动作方法不被调用?

我缺少将消息处理程序与路由/控制器联系起来的代码。

必须专门告知特定于路由的消息处理程序有关Web API应用程序的HttpConfiguration。我在WebConfigApi.cs中的所示是:

configuration.Routes.MapHttpRoute(
   name: "UpdateStuffAPI",
   routeTemplate: "api/updatestuff/post/{stuffid}",
   defaults: new { feedid = RouteParameter.Optional },
   constraints: null,
   handler: new MyMessageHandler()
);

我需要的是:

configuration.Routes.MapHttpRoute(
   name: "UpdateStuffAPI",
   routeTemplate: "api/updatestuff/post/{stuffid}",
   defaults: new { feedid = RouteParameter.Optional },
   constraints: null,
   handler: new MyMessageHandler(configuration)
);

换句话说,构造时需要将配置对象传递给消息处理程序。因此,消息处理程序需要一个构造函数:

public MyMessageHandler(HttpConfiguration httpConfiguration)
{
   InnerHandler = new HttpControllerDispatcher(httpConfiguration);
}

我天真地假设在路由图中设置handler: new MyMessageHandler()足以将消息处理程序绑回该路由映射到的控制器。

虽然解决了这一问题,但我诚然不明白为什么需要这一点(为什么我的假设是不正确的(,所以我要阅读。

您是否尝试使用:

启用属性路由

configuration.routes.mapmvcattributeroutes((;

路由还取决于映射属性路由和正常HTTP路由的顺序。

相关内容

  • 没有找到相关文章

最新更新