1

我設置了一個ASP.NET MVC 4 Web API來接受來自第三方服務器的請求,而我根本找不到如何設置路由映射。 假設第三方服務器期望得到答覆爲:Web API路由映射到根

  1. http://[my_server]/authorize?user=[user name]&session=[session token]&item=[item]
  2. http://[my_server]/release?user=[user name]&session=[session token]

或者,請求可以用專用的路徑,即:

  1. http://[my_server]/***api***/authorize?user=[user name]&session=[session token]&item=[item]
  2. http://[my_server]/***api***/release?user=[user name]&session=[session token]

我希望能夠支持這兩種選擇。

其他請求,繼傳統的/controller/id表單之後,也應該實現,但我想把重點放在上面(我甚至不確定Web API是否應該到這裏)。

我寫了下面的控制器:

public class MyController : ApiController 
{ 
    [HttpGet] 
    [ActionName("authorize")] 
    public string Authorize(string user, string session, string item) 
    { 
     ... 
     // return "OK" or "DENY"; 
    } 

    [HttpGet] 
    [ActionName("release")] 
    public string Release(string user, string session) 
    { 
     ... 
     return "OK"; 
    } 
} 

,並試圖一切我能找到SO和WebAppConfig.Register其他地方,但我不斷收到一個404錯誤,當我嘗試在瀏覽器的請求:

http://localhost:22332/api/authorize?user=ury&session=token&item=an_item 

我的問題是,我必須做什麼 - 特別是在WebAppConfig.Register和控制器 - 爲了服務上述請求(假設我的測試URL是正確的...)?

回答

1

經過幾個小時的工作,並從Route Debugger很多幫助 - 謝謝菲爾哈克! - 我發現問題和解決方案。

問題:路由映射匹配是命令RouteTable.Routes,其中應用程序的路由映射初始化,包含其中不少。我尋找的請求模式也與這些映射匹配(例如,「授權」被匹配爲控制器)。

解決方案:在默認映射之前添加「我的」路線映射

是啊,沒錯...

由於大多數操作中不支持HttpRouteCollection,生成的代碼是有點難看,但它的工作原理:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     routesCopy = new RouteBase[RouteTable.Routes.Count]; 

     RouteTable.Routes.CopyTo(routesCopy, 0); 

     config.Routes.Clear(); 
     config.Routes.MapHttpRoute(name: "AuthorizeWebApiRoute", routeTemplate: "authorize", defaults: new { controller = "My", action = "authorize" }); 
     config.Routes.MapHttpRoute(name: "ReleaseWebApiRoute", routeTemplate: "release", defaults: new { controller = "My", action = "release" }); 

     foreach (var route in routesCopy) 
     { 
      RouteTable.Routes.Add(route); 
     } 
    } 
} 

只要「我」的路線映射不匹配的默認映射(我讓他們具體不夠),我都很好 - 我認爲...

2

您正在被Web API約定絆倒,以便將URL中的控制器名稱與控制器類相匹配。

如果你的控制器的名稱是「myController的」,那麼這個請求的URL是:

http://localhost:22332/api/my/authorize?user=ury&session=token&item=an_item 

爲了支持請求的w/o在URL中的「API」位​​,只需添加第二個路徑定義在WebApiConfig.cs的Register方法中。既然你也是你的網址的使用「動作」,你需要這兩種路線:如果你想省略「API」前綴以及控制器參數

config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

    config.Routes.MapHttpRoute(
     name: "RootWebApiRoute", 
     routeTemplate: "{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

,我認爲你需要一個不同的路線定義。喜歡的東西:

public static void Register(HttpConfiguration config) { 
     config.Routes.MapHttpRoute(
      name: "ActionOnlyRoute", 
      routeTemplate: "{action}", 
      defaults: new { controller = "My" } 
     ); 
    } 

在這裏,我們只看看在URL和路由一切你「myController的」類的「動作」。

+0

謝謝馬克。 我不想忽略「api」,也不想使用控制器前綴,並且我沒有使用{id}參數(除非我錯過了某些內容)。 我嘗試了routeTemplate:「{action}」,但我得到了404頁面。 – ury

+0

好的,我已經更新了我的答案。希望這是你所追求的。 –

+0

聽起來很簡單,但仍然沒有去......我得到404,資源無法找到(資源是「授權」,「釋放」等)。 我一遍又一遍地檢查拼寫(通常的嫌疑犯),沒關係。任何想法如何找出發生了什麼問題? – ury