【问题标题】:MVC 4 Web API Routing issuesMVC 4 Web API 路由问题
【发布时间】:2013-01-24 22:23:09
【问题描述】:

这是我第一次使用 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.我是否需要在我的控制器中做一些特别的事情,例如。指定非操作和操作、操作名称等

感谢任何帮助

【问题讨论】:

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


    【解决方案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 用于决定使用哪个操作(公共方法)。另外,由于动作名称不以Get 开头,因此我需要为每个方法添加一个属性[HttpGet],以将它们标记为能够接收GET 请求。

    祝你的项目好运。

    【讨论】:

    • 感谢克里斯托弗!非常深思熟虑的解释。现在这一切都说得通了。再次感谢!
    • 没问题。 MVC 充满了约定优于配置。一旦你学会了约定,它就有意义了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2013-08-30
    • 2012-09-28
    相关资源
    最近更新 更多