2013-04-30 63 views
1

的第一段我想我的ASP.NET Web API來接受這個請求:網頁API路線僅匹配在URL

http://domain.com/proxy/service?id=12 

,並僅在第一/代理/器官匹配,它路由到此控制器行動。因此,操作的參數將是URL的其餘部分:「服務ID = 124」

public string Get(string url) 
{ 
    //Calls external resource and returns response 
} 

的URL可以有任意數目的分段,查詢字符串後(其充當代理,取消幾個遠程服務器),但不匹配。

我想這樣下面的東西,但它不工作。只要url在/ proxy/part之後有多於一個段,就會與之匹配。

config.Routes.MapHttpRoute(
     name: "ApiProxy", 
     routeTemplate: "proxy/{resourcePath}", 
     defaults: new { Controller = "Proxy", Action="Get" } 
); 

我已經尋找到MessageHandlers,但他們被解僱了所有的請求,這似乎並不理想,並希望我可以綁成標準的網絡API路線,而不是。

回答

2

變化{resourcePath}{*resourcePath}

更新

我錯過了你要創建一個代理的事實。你真的想用一個消息處理程序來代替控制器。在創建路由時,您可以傳遞僅在匹配路由時應用的消息處理程序。 通過使用消息處理程序,更容易異步代理請求,它應該比通過ApiController中的所有goop快得多。

+0

這幾乎可行,但它返回「service」,而不是「service?id = 12」作爲傳遞給Action方法的參數。我最終不得不在上下文中使用Request.Uri手動去除網址......不是很mvc;) – 2013-05-01 10:22:55

+0

很酷,我確實注意到它減慢了查詢的速度。我會看看MessageHandler。謝謝。 – 2013-05-02 11:15:44

0

使用通配符(如{* resourcePath})似乎只能解決部分問題。這意味着它會調用正確的Action,但它只會將部分URL作爲resourcePath參數傳遞給Action方法。它不喜歡具有querystrings的Url。

我不得不將通配符與Request.Uri結合使用來手動刪除URL的其餘部分。