需要在Web API 2中使用相同的控制器

时间:2016-03-08 07:41:08

标签: c# asp.net-web-api

如何在Web API 2中使用两个相同的控制器。

我需要使用以下网址。

mysite/api/Contacts/get/2

mysite/api/v1/Contacts/get/2

但如果我使用单独的文件夹,则会出错。

我的WebApiConfig.cs就像这样

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

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

            config.Routes.MapHttpRoute(
                name: "DefaultApi2",
                routeTemplate: "api/v1/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

这是错误

  

找到了多个匹配名为“default”的控制器的类型。   如果为此请求提供服务的路由,则会发生这种情况   ('api / v1 / {controller} / {id}')找到了多个定义的控制器   相同的名称但不同的名称空间,不受支持。该   'default'请求找到以下匹配的控制器:   TestWebAPI.Controllers.DefaultController   TestWebAPI.Controllers.v1.DefaultController

我如何实现这一目标?...基本上我需要这个用于版本控制。

1 个答案:

答案 0 :(得分:0)

  

如果为此请求提供服务的路由(' api / v1 / {controller} / {id}')发现多个控制器使用相同名称但名称空间不同而不支持,则会发生这种情况

这意味着您有两个名为DefaultController的不同控制器(如您所述)。

如果要使用相同的控制器同时提供两个网址,只需删除v1文件夹中的网址即可。如果要为每个控制器提供每个URL,则应为每个控制器指定命名空间。

var r = routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
r.DataTokens["Namespaces"] = new string[] {"Foo"};

blog post中的详细信息。