ASP.NET MVC 4中Web Api中的路由

Yas*_*ser 7 asp.net-mvc asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api

我在ASP.NET MVC 4中使用web api.

我有以下命名的控制器

  • CustomerController:控制器
  • CustomerApiController:ApiController

之前我CustomerApiController被命名CustomersController为访问它,我只需要打入以下网址

本地主机/ API /客户

但现在我必须将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 }
        );
Run Code Online (Sandbox Code Playgroud)

请有人指导我这个.谢谢

tpe*_*zek 14

那么你的代码中有两个问题.您正在使用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 }
);
Run Code Online (Sandbox Code Playgroud)

现在,如果您希望您的解决方案更通用(当您有更多需要像这样修改的控制器时),您可以使用自定义HttpControllerRouteHandler来转换传入控制器名称,这样您就可以保持默认路由.

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

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

        return base.GetHttpHandler(requestContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样注册您的HttpRoute:

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

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