0

我有一個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正確調用我的控制器的操作方法。

所以我認爲路由定義有問題。然而,消息處理程序與特定路線佈線調用,Route Debugger表明正在使用時,我後到我的控制器(http://hostname/api/updatestuff/post?stuffid=12345),該路由

爲什麼我的行爲方法被調用時,我以特定於路線的方式連接消息處理程序?

回答

0

我錯過了將消息處理程序重新綁定到應該調用的路由/控制器的代碼。

路由特定的消息處理程序必須具體講述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()足以扳平消息處理回控制器(s)表示,路由映射。

儘管解決了這個問題,但我仍然不明白爲什麼這是必需的(爲什麼我的假設是不正確的),所以我要讀一讀。

0

您是否嘗試過讓屬性使用路由:

configuration.Routes.MapMvcAttributeRoutes();

路由也依賴於映射屬性路由和正常http路由的順序。

+0

我在一點使用屬性路由,但指定消息處理程序仍然必須完成,並且我相信路由映射定義是必需的。 – Howiecamp

相關問題