你快到了。默认路由(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 类型的请求会自动发送到以 Url 开头Get
并具有与模板匹配的参数的操作(有两种不同的情况,因为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 请求。
祝你的项目好运。