【问题标题】:MVC4 Web-API - Route mapping help requiredMVC4 Web-API - 需要路由映射帮助
【发布时间】:2013-04-09 13:28:32
【问题描述】:

我有一个名为

的控制器

产品 我有三个动作

  • Product接受一个 int 返回一个模型(类)对象
  • 类别接受一个字符串返回模型(类)对象的数组
  • 全部无参数返回模型(类)对象数组

我正在尝试的是以下映射

产品 -> api/产品/产品/1

类别 -> api/产品/类别/酱料

全部 -> api/产品/全部

由于动作名称支持 URL 结构,所以我尝试了一个通用路由

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

一切正常,但是当我使用这个http://localhost:2271/api/products/category/2 URL 时出现以下错误

<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:2271/api/products/category/2'.
</Message>
<MessageDetail>
No action was found on the controller 'Products' that matches the request.
</MessageDetail>
</Error>

另一方面,这个 URL api/products/category/?cat=abc & api/products/category?cat=abc 工作正常...... [cat 是我的接收参数名称]

求助!!!

【问题讨论】:

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


    【解决方案1】:

    另一方面,此 URL api/products/category/?cat=abc & api/products/category?cat=abc 工作正常

    是的,没错,它会的,这就是 RPC 的做法。如果你想保持 RESTful 的方式,你可以有以下路由配置:

    config.Routes.MapHttpRoute(
        name: "ProductById",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    
    config.Routes.MapHttpRoute(
        name: "ProductByCategory",
        routeTemplate: "api/{controller}/category/{cat}"
    );
    
    config.Routes.MapHttpRoute(
        name: "DefaultByAction",
        routeTemplate: "api/{controller}/{action}",
        defaults: new { action = "Get" }
    );
    
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    

    您的控制器将如下所示:

    public class ProductsController : ApiController
    {
        // api/products/
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };            
        }
    
        // api/products/5
        [HttpGet]
        public string Get(int id)
        {
            return "Product" + id;
        }
    
        // api/products/category/fruits
        [HttpGet]
        public string Category(string cat)
        {
            return "Product " + cat;
        }    
    }
    

    注意:为简单起见,我返回了字符串,但我假设您将返回 Product 的实例,并且您可以轻松更改代码以执行此操作。

    【讨论】:

    • 嘿,谢谢您的回答,您能否具体说明一下它是如何不维护 RESTful 方式的,我是 REST API 的新手..
    • 很高兴为您提供帮助。我认为a link to a well-written article is better。那里提到了 RPC。还有其他文档可以更好地解释它,但我必须谷歌它们:)
    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多