0

我有一个名为的控制器

产品 和我有三个动作

  • 产品接受一个 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/2URL时出现以下错误

<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 是我的接收参数名称]

帮助 !!!

4

1 回答 1

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;
    }    
}

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

于 2013-04-09T05:28:32.420 回答