Web API中的Uri路径扩展映射

时间:2012-08-06 14:56:39

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

我正在尝试在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 。任何想法,我缺少什么?

2 个答案:

答案 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}