你快到了。默认路由(在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 用于决定使用哪个操作(公共方法)。另外,由于动作名称不以Get 开头,因此我需要为每个方法添加一个属性[HttpGet],以将它们标记为能够接收GET 请求。
祝你的项目好运。