7

我正在使用带有 ASP.NET MVC 4 的 web api。

我有以下命名控制器

  • 客户控制器:控制器
  • 客户ApiController: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 }
        );

请有人指导我。谢谢

4

2 回答 2

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 }
);

现在,如果您希望您的解决方案更通用(当您有更多需要像这样修改的控制器时),您可以使用自定义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);
    }
}

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

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

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

于 2012-10-05T09:50:36.760 回答
0

您可以扩展DefaultHttpControllerSelector并覆盖 GetControllerName 以应用自定义规则。默认实现只是从路由数据中返回“控制器”变量的值。自定义实现可以将其映射到其他值。请参阅路由和操作选择

于 2012-10-05T14:59:24.530 回答