特定于路由的 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我连接特定于控制器操作方法的消息处理程序路由中:

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

当我 POST 到控制器操作方法时,例如:

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

消息处理程序按预期拦截请求。但是在逐步执行时:

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

控制器操作方法永远不会被命中。

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

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

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

所以我的想法是路线定义有问题。然而,该消息处理程序调用与路由专用布线,并且路由调试器显示,当我POST到我的控制器(http://hostname/api/updatestuff/post?stuffid=12345即),该路由使用。

当我以特定于路由的方式连接消息处理程序时,为什么不调用我的操作方法?

豪伊坎普

我错过了将消息处理程序与它接下来应该调用的路由/控制器相关联的代码。

必须特别告知特定于路由的消息处理程序有关 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()路由映射中的设置足以将消息处理程序与路由映射到的控制器联系起来。

虽然这已经解决了,但我承认我还不明白为什么需要这样做(为什么我的假设不正确)所以我要仔细阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Asp.net MVC项目中的Angularjs调用Web API控制器

来自分类Dev

ASP.NET MVC 4路由匹配,但从不调用控制器

来自分类Dev

在ASP.Net Web API中,如何更改特定控制器或操作的默认格式化程序

来自分类Dev

ASP.NET MVC Web Api帮助页面路由

来自分类Dev

Asp.Net Mvc Web Api路由404

来自分类Dev

如何从Web API调用ASP.NET Core Web MVC

来自分类Dev

如何从Web API调用ASP.NET Core Web MVC

来自分类Dev

从ASP.NET MVC控制器将数据发布到ASP.NET Web API控制器时的待处理请求

来自分类Dev

从ASP.NET MVC应用程序访问Web API路由

来自分类Dev

从ASP.NET MVC应用程序访问Web API路由

来自分类Dev

ASP.NET MVC路由与特定操作

来自分类Dev

定期在asp.net Web API中调用控制器操作

来自分类Dev

使控制器对ASP.NET WEB API(或MVC)中的客户端不可见

来自分类Dev

将Asp.Net MVC控制器转换为Web API的最佳方法

来自分类Dev

从ASP.net MVC 4 WEB API控制器返回byte []

来自分类Dev

asp.net mvc / web api 2-控制器接受JSON对象数组

来自分类Dev

Json格式。使用Web Api控制器,ASP.NET MVC缩进

来自分类Dev

从ASP.net MVC 4 WEB API控制器返回byte []

来自分类Dev

Json格式。使用Web Api控制器,ASP.NET MVC缩进

来自分类Dev

将Asp.Net MVC控制器转换为Web API的最佳方法

来自分类Dev

ASP.net MVC Web API + Android

来自分类Dev

ASP.net MVC Web API + Android

来自分类Dev

ASP.NET MVC和WEB API

来自分类Dev

Asp.net Web API的按操作名称路由路由

来自分类Dev

Angularjs + ASP.NET MVC + ASP.NET Web API

来自分类Dev

Asp.NET Web API显示所有控制器的路由

来自分类Dev

ASP.NET Web API路由单元测试-未检测到控制器动作

来自分类Dev

ASP.NET Web API v2中的后备控制器路由

来自分类Dev

ASP.NET Web API v2中的后备控制器路由

Related 相关文章

热门标签

归档