这是我的第一个使用MVC Web API的竞技场,我在理解路由方面遇到了一些问题。我想要一个类似于这个的uri模板:
http://google.com/api/ {controller} / {id}< - 默认 http://google.com/api/ {controller} / {chartType} / {id}其中ID是可选的
我在努力的地方是: 1.我在WebApiConfig.cs文件中添加了什么法语 2.我是否需要在我的控制器中进行特殊处理,例如。指定NonActions&行动,行动名称等
感谢任何帮助
答案 0 :(得分:1)
你快到了。默认路由(在WebApiConfig.cs
中如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
有一个 非常 重要警告:路由按照使用第一个匹配的路由声明的顺序进行检查,因此默认路由需要进行< EM>最后
有了这个,您需要做出决定,您是否希望各种图表类型的调用能够进行一次或多次?
对于一个动作:
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的一部分用于决定使用哪个操作(公共方法)。此外,由于操作名称不以Get
开头,因此我需要为每个方法添加一个属性[HttpGet]
,以将其标记为能够接收GET请求。
祝你的项目好运。