2013-03-21 29 views
0

儘管我已經在直MVC中使用了路由,但我還沒有使用ASP.NET WebAPI。顯然我做錯了什麼,也許有人可以幫忙? 我有一個名爲UsersController的控制器及其上的兩個方法,Register和Details,都帶兩個字符串參數並返回一個字符串,都標記爲HttpGet。 本來我開始有兩個路徑映射在WebApiConfig.cs:在MVC中未識別的路徑4 WebAPI

config.Routes.MapHttpRoute(
     name: "TestApi", 
     routeTemplate: "api/{controller}/{action}/{userId}/{key}" 
); 
    config.Routes.MapHttpRoute(
     name: "Test2Api", 
     routeTemplate: "api/{controller}/{action}/{userId}/{class}" 
); 

有了這個成立只有第一個途徑是找到了一個網址,如:

http://<domain>/api/users/register/a123/b456/ 

如果我稱之爲:

http://<domain>/api/users/details/a123/b456/ 

我得到了一個404.如果我交換了兩條路線,那麼我可以調用Details方法而不是Register方法,再次獲得404。我已經制定的解決方法是更具體地說明FIC與路線:

config.Routes.MapHttpRoute(
     name: "TestApi", 
     routeTemplate: "api/{controller}/register/{userId}/{key}" 
); 
    config.Routes.MapHttpRoute(
     name: "Test2Api", 
     routeTemplate: "api/{controller}/details/{userId}/{class}/" 
); 

的UsersController的樣子:

namespace HelloWebAPI.Controllers 
{ 
    using System; 
    using System.Web.Http; 
    using HelloWebAPI.Models; 

    public class UsersController : ApiController 
    { 
     [HttpGet] 
     public string Register(string userId, string key) 
     { 
     return userId + "-" + key; 
     } 

     [HttpGet] 
     public string Enrolments(string userId, string @class) 
     { 
     return userId + "-" + @class 
     } 
    } 
} 

所以我不明白的是爲什麼路由的{}行動部件中登記的第二不被用正確的關聯方法。

感謝

+0

你能分享你的行爲'註冊'和'細節'的樣子嗎? – 2013-03-22 06:16:30

+0

我已將該課程添加到帖子中。 – 2013-03-22 08:34:46

回答

2

在ASP路由.NET Web API有三個步驟:

  1. 將URI匹配到路由模板。
  2. 選擇控制器。
  3. 選擇一個動作。

框架在路由表中選擇與URI匹配的第一個路由,當第二個或第三個步驟失敗時沒有「第二個猜測」 - 只有404。在你的情況下,兩個URI總是匹配第一個所以第二個路線從不使用。

對於進一步的分析,讓我們假設第一條路線是:

api/{controller}/{action}/{userId}/{key}

你有以下URI調用它:

http://<domain>/api/users/enrolments/a123/b456/

爲了選擇行動框架正在檢查3東西:

  • 請求的HTTP方法。
  • 路徑模板中的{action}佔位符(如果存在)。
  • 控制器上的操作參數。

在這種情況下,{action}部分將被正確解析爲enrolments,但框架將與userIdkey參數來尋找Enrolments方法。你的方法有一個class參數不匹配。這將導致404。

要避免此問題,您必須制定更具體的路線(如您所做的那樣)或統一參數名稱。

+0

謝謝,我想我現在明白了。我會嘗試一些路線和方法簽名的不同組合,以確保我已經掌握了它。 – 2013-03-22 10:19:03

1

你只需要定義一個路線:

config.Routes.MapHttpRoute(
    name: "TestApi", 
    routeTemplate: "api/{controller}/{action}/{userId}/{key}" 
); 

然後改變你的控制器方法如下:

[HttpGet] 
public string Register(string userId, string key) 
{ 
    return userId + "-" + key; 
} 

[HttpGet] 
public string Details(string userId, string key) 
{ 
    return userId + "-" + key 
} 
+0

謝謝,我明白爲什麼會這樣。但我不想更改參數的名稱,我希望它們反映實際的用途。 – 2013-03-22 09:24:39