Asp.net mvc ASP.NET MVC 4中Web Api中的路由

Asp.net mvc ASP.NET MVC 4中Web Api中的路由,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,Asp.net Mvc Routing,我正在使用ASP.NETMVC4的web api 我有以下命名控制器 客户控制器:控制器 CustomerApicController:ApicController 早些时候,我的CustomerApiController名为customercontroller,因此要访问它,我只需输入以下url localhost/api/Customers 但是现在我必须将api控制器名称保留为CustomerApiController。我希望能够使用localhost/api/Customers实现相

我正在使用ASP.NETMVC4的web api

我有以下命名控制器

  • 客户控制器:控制器
  • CustomerApicController:ApicController
早些时候,我的
CustomerApiController
名为
customercontroller
,因此要访问它,我只需输入以下url

localhost/api/Customers

但是现在我必须将api控制器名称保留为
CustomerApiController
。我希望能够使用
localhost/api/Customers
实现相同的方法,我需要做哪些更改

我尝试在
RouteConfig.cs
文件中进行一些更改。我尝试将以下内容添加到RegisterRoutes方法中,但都不起作用

routes.MapHttpRoute(
            name: "API Default",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

routes.MapRoute(
            name: "Customers",
            url: "api/customer/",
            defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional }
        );

请有人能在这方面指导我。谢谢

您的代码中有两个问题。您正在使用MapRoute而不是MapHttpRoute。您还应将更详细的路线放在第一位,以免被更通用的路线吞没:

routes.MapHttpRoute(
    name: "Customer",
    url: "api/Customer/{id}",
    defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional }
); 

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
现在,如果您希望您的解决方案更通用(当您有更多需要这样修改的控制器时),您可以使用custom
HttpControllerOutehandler
来转换传入的控制器名称,这样您就可以保留默认路由

首先,您需要创建自定义的HttpControllerOutehandler:

public class CustomHttpControllerRouteHandler : HttpControllerRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString() + "Api";

        return base.GetHttpHandler(requestContext);
    }
}
现在,您可以按如下方式注册您的HttpRoute:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
).RouteHandler = new CustomHttpControllerRouteHandler();

这样,当您将Customer放入URL时,引擎会将其视为CustomerApi。

您可以扩展并覆盖GetControllerName以应用自定义规则。默认实现只是从路由数据返回“controller”变量的值。自定义实现可以将此映射到其他值。请参阅。

这已经过时了吗?无法在MapHttpRoute方法中使用url参数。