我有一个 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()
);
当我发布到控制器操作方法时,例如:
http://hostname/api/updatestuff/post?stuffid=12345
消息处理程序按预期拦截请求。但是在单步执行中:
var response = await base.SendAsync(request, cancellationToken);
控制器操作方法永远不会被击中。
作为测试,我删除了特定于路由的布线并使消息处理程序全局化:
configuration.MessageHandlers.Add(new MyMessageHandler());
并SendAsync
正确调用我的控制器的操作方法。
所以我的想法是路线定义有问题。但是,消息处理程序是通过特定于路由的接线调用的,并且,Route Debugger显示当我 POST 到我的控制器 ( ) 时,正在http://hostname/api/updatestuff/post?stuffid=12345
使用该路由。
当我以特定于路由的方式连接消息处理程序时,为什么没有调用我的操作方法?