2

這是我第一次使用MVC Web API進行Rodeo,並且我在理解路由方面有一些問題。我想有類似thise一個URI模板:MVC 4 Web API路由問題

  1. http://google.com/api/AzureQueue - 獲取隊列中的
  2. http://google.com/api/AzureQueue/DeviceChart/所有項目 - 獲取回報的設備和處理時間爲代理

http://google.com/api/ {控制器}/{id} < - 默認 http://google.com/api/ {控制器}/{chartType}/{id}其中ID是可選的

我在這裏掙扎的是: 1.我在WebApiConfig.cs文件中輸入了什麼法國文件 2.我是否需要在我的控制器中執行特殊的文件操作,例如: specifiy NonActions &操作,動作名稱等

任何幫助表示讚賞

回答

1

你幾乎沒有。缺省路由(在WebApiConfig.cs看起來是這樣的:

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

有一個非常重要的警告:路由進行檢查的,因爲它們與第一個匹配的一個聲明的順序被使用,所以默認路由需要去最後

有了這樣的方式,你需要做一個決定,你要爲各種圖表類型的呼叫轉接到一個動作,或許多?

對於一個動作:

WebApiConfig.cs

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

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

AzureQueueController.cs

public class AzureQueueController : ApiController 
{ 
    public string Get(string chartType) 
    { 
     return "chart = " + chartType; 
    } 
    public string Get(string chartType, int id) 
    { 
     return "chart = " + chartType + ",id = " + id.ToString(); 
    } 
} 

有兩件事情需要注意。在分配給默認值的匿名類中,控制器的值決定將請求路由到哪個控制器。這可以在路由模板中,或者簡單地在類中定義。此外,類型爲Get的請求會自動發送到以Get開頭的操作,並且在Url中具有與模板匹配的參數(由於id是可選的,因此有兩種不同的情況)。

這將是我首選的方式,除非各種圖表的業務邏輯不同。

在另一方面,你可以指定這個:

WebApiConfig.cs

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

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

由於我使用這個詞action是模板,這將得到解釋爲操作名稱。

AzureQueueController.cs

[HttpGet] 
    public string DeviceChart() 
    { 
     return "chart = DeviceChart" ; 
    } 

    [HttpGet] 
    public string DeviceChart(int id) 
    { 
     return "chart = DeviceChart" + ",id = " + id.ToString(); 
    } 

這裏沒有字符串參數,URL的一部分被用來決定哪些行動(public方法)來使用。另外,由於動作名稱不以Get開頭,因此我需要爲每種方法添加一個屬性[HttpGet],以將它們標記爲能夠接收GET請求。

祝您的項目順利。

+0

謝謝克里斯託弗!非常深思熟慮的解釋。現在這一切都有道理。再次感謝! – 2013-02-09 05:30:18

+0

沒問題。 MVC充滿了對配置的約定。一旦你學習了這些約定,這是有道理的。 :) – 2013-02-09 05:55:29