【问题标题】:Routing in Web Api in ASP.NET MVC 4ASP.NET MVC 4 中的 Web Api 中的路由
【发布时间】:2012-09-26 09:45:03
【问题描述】:

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

我有以下命名控制器

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

请有人指导我。谢谢

【问题讨论】:

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


    【解决方案1】:

    您的代码中有两个问题。您正在使用 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

    【讨论】:

    • 这已经过时了? MapHttpRoute方法中不能使用url参数。
    【解决方案2】:

    您可以扩展 DefaultHttpControllerSelector 并覆盖 GetControllerName 以应用自定义规则。默认实现只是从路由数据中返回“控制器”变量的值。自定义实现可以将其映射到其他值。见Routing and Action Selection

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多