我正在尝试在Web API中使用Uri路径扩展映射。我已正确设置路线:
routes.MapHttpRoute(
name: "Api with extension",
routeTemplate: "api/{controller}.{ext}/{id}",
defaults: new { id = RouteParameter.Optional, ext = RouteParameter.Optional }
);
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
它可以使用默认路由,例如 /api/products.json/123 ,但对于其他方法,例如 /api/products.json?categoryid=5 我收到错误消息:
"No action was found on the controller 'Products' that matches the request."
所有路由工作都找不到扩展名,例如 / api / products / 123 和 / api / products?categoryid = 5 。任何想法,我缺少什么?
答案 0 :(得分:8)
如果有其他人遇到这个,那么答案(如何让Uri扩展映射工作)可能是以下(这对我自己有用,经过很多挫折和搜索)
将以下内容添加到您的web.config中,进入System.WebServer部分
<modules runAllManagedModulesForAllRequests="true"/>
答案 1 :(得分:1)
/api/products.json?categoryid=5
将映射到以下控制器操作:
public class ProductsController : ApiController
{
public string Get(int categoryid)
{
return categoryid.ToString();
}
}
因此请确保此控制器和操作存在。在评论部分,您似乎已经指出了一些GetProduct(int id)
和GetProductsByCategory(int categoryid)
操作,但这些操作永远不会被使用。根据RESTful约定,当您使用Get
动词时,将调用GET
操作。如果要使用某些非RESTful操作名称,请确保在路由定义中包含{action}
。