2

这是我第一次使用MVC Web API进行Rodeo,并且我在理解路由方面有一些问题。我想有类似thise一个URI模板:MVC 4 Web API路由问题

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

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

我在这里挣扎的是: 1.我在WebApiConfig.cs文件中输入了什么法国文件 2.我是否需要在我的控制器中执行特殊的文件操作,例如: specifiy NonActions &操作,动作名称等

任何帮助表示赞赏

回答

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的请求会自动发送到以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的一部分被用来决定哪些行动(public方法)来使用。另外,由于动作名称不以Get开头,因此我需要为每种方法添加一个属性[HttpGet],以将它们标记为能够接收GET请求。

祝您的项目顺利。

+0

谢谢克里斯托弗!非常深思熟虑的解释。现在这一切都有道理。再次感谢! – 2013-02-09 05:30:18

+0

没问题。 MVC充满了对配置的约定。一旦你学习了这些约定,这是有道理的。 :) – 2013-02-09 05:55:29