你幾乎沒有。缺省路由(在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請求。
祝您的項目順利。
謝謝克里斯託弗!非常深思熟慮的解釋。現在這一切都有道理。再次感謝! – 2013-02-09 05:30:18
沒問題。 MVC充滿了對配置的約定。一旦你學習了這些約定,這是有道理的。 :) – 2013-02-09 05:55:29