MVC 4 Web API路由问题

时间:2013-02-09 03:35:34

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-mvc-routing

这是我的第一个使用MVC Web API的竞技场,我在理解路由方面遇到了一些问题。我想要一个类似于这个的uri模板:

  1. http://google.com/api/AzureQueue - 获取队列中的所有项目
  2. http://google.com/api/AzureQueue/DeviceChart/ - GET返回代理商的设备和处理时间
  3. http://google.com/api/ {controller} / {id}< - 默认 http://google.com/api/ {controller} / {chartType} / {id}其中ID是可选的

    我在努力的地方是: 1.我在WebApiConfig.cs文件中添加了什么法语 2.我是否需要在我的控制器中进行特殊处理,例如。指定NonActions&行动,行动名称等

    感谢任何帮助

1 个答案:

答案 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请求。

祝你的项目好运。