2

这是我第一次使用 MVC Web API 进行牛仔竞技表演,我在理解路由方面时遇到了一些问题。我想要一个类似于thise的uri模板:

  1. http://google.com/api/AzureQueue - 获取队列中的所有项目
  2. http://google.com/api/AzureQueue/DeviceChart/ - GET 返回设备和代理的处理时间

http://google.com/api/ {controller}/{id} <-- 默认 http://google.com/api/ {controller}/{chartType}/{id} 其中 ID 是可选的

我苦苦挣扎的地方是: 1. 我在 WebApiConfig.cs 文件中放了什么法式 toash 2. 我是否需要在我的控制器中做一些特别的事情,例如。指定非动作和动作、动作名称等

任何帮助表示赞赏

4

1 回答 1

1

你快到了。默认路由(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 请求。

祝你的项目好运。

于 2013-02-09T04:40:17.550 回答