.net webapi中的Uri路径扩展映射

.net webapi中的Uri路径扩展映射,.net,routes,asp.net-mvc-4,asp.net-web-api,.net,Routes,Asp.net Mvc 4,Asp.net Web Api,我试图让Uri路径扩展映射在WebAPI中工作。我已正确设置路线: routes.MapHttpRoute( name: "Api with extension", routeTemplate: "api/{controller}.{ext}/{id}", defaults: new { id = RouteParameter.Optional, ext =

我试图让Uri路径扩展映射在WebAPI中工作。我已正确设置路线:

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。有人知道我遗漏了什么吗?

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

如果其他人遇到此问题,那么答案(如何使Uri扩展映射工作)可能如下所示(这对我自己来说很有效,经过了许多挫折和搜索)

将以下内容添加到web.config的System.WebServer部分

<modules runAllManagedModulesForAllRequests="true"/>


请发布映射这两条路径的操作,它们将映射到:GetProduct(int-id)和GetProductsByCategory(int-categoryid)。我的路径工作正常,只有在尝试使用UriPathExtensionMapping时才失败。据我所知,URI决定调用哪个动作get,因此URI/api/products?categoryid=5与动作GetProductsById(int categoryid)的签名匹配,因此调用被路由到那里。所有的代码都是基于本教程的一部分,并且在没有扩展的情况下运行良好——只是我在工作中遇到了问题。