MVC 4 Web API路由问题
这是我第一次使用MVC Web API进行Rodeo,并且我在理解路由方面有一些问题。我想有类似thise一个URI模板:MVC 4 Web API路由问题
- http://google.com/api/AzureQueue - 获取队列中的
- http://google.com/api/AzureQueue/DeviceChart/所有项目 - 获取回报的设备和处理时间为代理
http://google.com/api/ {控制器}/{id} < - 默认 http://google.com/api/ {控制器}/{chartType}/{id}其中ID是可选的
我在这里挣扎的是: 1.我在WebApiConfig.cs文件中输入了什么法国文件 2.我是否需要在我的控制器中执行特殊的文件操作,例如: specifiy NonActions &操作,动作名称等
任何帮助表示赞赏
你几乎没有。缺省路由(在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