MVC4 Web-API - 需要路由映射帮助

时间:2013-04-09 04:29:31

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

我有一个名为

的控制器

产品 我有三个动作

  • 产品采用int返回模型(类)对象
  • 类别接受一个字符串返回模型(类)对象的数组
  • 全部没有参数返回模型(类)对象的数组

我正在尝试的是以下映射

产品 - > 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网址

时,我收到以下错误消息
<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>

另一方面,此网址api/products/category/?cat=abc&amp; api/products/category?cat=abc正在工作...... [猫是我的接收参数名称]

帮助!!!

1 个答案:

答案 0 :(得分:1)

  

另一方面,这个URL api / products / category /?cat = abc&amp;   api /产品/类别?cat = abc正在使用fiine

是的,它是正确的,它将是这样做的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的实例,并且您可以轻松更改代码来执行此操作。