Asp.net mvc 4 MVC4 Web API-需要路由映射帮助

Asp.net mvc 4 MVC4 Web API-需要路由映射帮助,asp.net-mvc-4,asp.net-web-api-routing,Asp.net Mvc 4,Asp.net Web Api Routing,我有一个控制器名为 产品 我有三个动作 产品:接受一个int返回一个模型(类)对象 类别:获取一个字符串,返回模型(类)对象的数组 All:无参数返回模型(类)对象的数组 我尝试的是以下映射 产品->api/products/Product/1 类别->api/产品/类别/酱汁 全部->api/product/All 由于动作名称支持URL结构,所以我尝试了一个通用的路由 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplat

我有一个控制器名为

产品 我有三个动作

  • 产品:接受一个int返回一个模型(类)对象
  • 类别:获取一个字符串,返回模型(类)对象的数组
  • All:无参数返回模型(类)对象的数组
我尝试的是以下映射

产品->api/products/Product/1

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

全部->api/product/All

由于动作名称支持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>

未找到与请求URI名称匹配的HTTP资源http://localhost:2271/api/products/category/2'.
在与请求匹配的控制器“产品”上未找到任何操作。
另一方面,此URL
api/products/category/?cat=abc
&
api/products/category?cat=abc
正在运行。。。。。。[cat是我的接收参数名称]

救命啊

另一方面,此URL api/products/category/?cat=abc& api/产品/类别?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;
    }    
}
公共类产品控制器:ApiController
{
//原料药/产品/
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
//api/products/5
[HttpGet]
公共字符串Get(int-id)
{
返回“产品”+id;
}
//原料药/产品/类别/水果
[HttpGet]
公共字符串类别(字符串类别)
{
返回“产品”+cat;
}    
}

注意:为了简单起见,我返回了字符串,但我假设您将返回
产品的一个实例
,您可以很容易地更改代码来执行此操作。

嘿,谢谢您的回答,请您详细说明它是如何不以RESTful方式维护的,我是RESTAPI新手。很高兴提供帮助。我想。这里提到了RPC。还有其他文档可以更好地解释这一点,但我必须用谷歌搜索它们:)