1

我有我的global.asax.cs部分航線的安裝文件是這樣的:ASP.NET網頁API路由未能趕上參數

routes.MapHttpRoute(
      name: "ColorsRoute", 
      routeTemplate: "api/{controller}/{action}/{styleId}", 
      defaults: new 
      { 
       controller = "Cars", 
       action = "Colors" 
      } 
     ); 

控制器:

public Dictionary<string, string> Colors(string styleid) 
    { 
     //returns a dictionary of colors and ids 
    } 

的事情是,當使用這樣的URL:

localhost:58645/api/cars/colors/18752867 

犯規拿起styleId,但它的工作原理傳統使用它是這樣的:

localhost:58645/api/cars/colors?styleid=18752867 

關於爲什麼會發生這種情況的任何想法?

UPDATE:

 routes.MapHttpRoute(
      name: "MakesRoute", 
      routeTemplate: "api/{controller}/{action}/{state}", 
      defaults: new 
      { 
       controller = "Cars", 
       action = "Makes" 
      } 
     ); 

控制器:

public Dictionary<string, string> Makes(string state)  
    { 
     //return dictionary of makes and ids 
    } 

這裏

這些線路與電話這樣的 「domain.com/api/cars/makes/new」 工作正常是我的額外路線:

 routes.MapHttpRoute(
      name: "ModelsRoute", 
      routeTemplate: "api/{controller}/{action}/{make}/{state}", 
      defaults: new 
      { 
       controller = "Cars", 
       action = "Models" 
      } 
     ); 

     routes.MapHttpRoute(
      name: "YearsRoute", 
      routeTemplate: "api/{controller}/{action}/{modelId}/{state}", 
      defaults: new { 
       controller = "Cars", 
       action = "Years" 
      } 
     ); 

     routes.MapHttpRoute(
      name: "StylesRoute", 
      routeTemplate: "api/{controller}/{action}/{make}/{model}/{year}", 
      defaults: new { 
       controller = "Cars", 
       action = "Styles" 
      } 
     ); 
+0

你說你有一些路線,但你只顯示一個。是否有其他路線在您的Global.Asax – cecilphillip 2012-04-15 14:34:39

回答

4

根據您定義路線的順序,匹配的路線可能不是您希望將您的請求發送到的路線。特別是使用您的年份和路線。您有相同數量的段,但沒有指定任何路由約束。

嘗試把MapHttpRoute作爲第一個註冊的路線,並添加一個正則表達式約束

routes.MapHttpRoute(
     name: "ColorsRoute", 
     routeTemplate: "api/{controller}/{action}/{styleId}", 
     defaults: new 
     { 
      controller = "Cars", 
      action = "Colors" 
     }, 
     constraints: new { styleId = @"\d+" } 
    ); 

看看現在匹配。

UPDATE
另一種選擇是具體界定爲您的URI直接映射到您的ApiController和行動方法要已經使用的路由。這樣的請求總是去你想要的行動

+0

謝謝 - 我會試一試並回復你。 – gdp 2012-04-17 11:41:35

+0

事實證明MakesRoute與它衝突,所以我物理定義了使它工作的控制器和動作。如果你用這些話來更新你的答案,我會除外。 – gdp 2012-04-18 14:21:23