【问题标题】:Need To use Identical Controllers in Web API 2需要在 Web API 2 中使用相同的控制器
【发布时间】:2016-03-08 07:41:08
【问题描述】:

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

我需要使用如下 URL。

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}') 发现多个控制器定义为 名称相同但命名空间不同,不支持。这 对“默认”的请求已找到以下匹配的控制器: TestWebAPI.Controllers.DefaultController TestWebAPI.Controllers.v1.DefaultController

我怎样才能做到这一点?...基本上我需要这个来进行版本控制。

【问题讨论】:

  • 您遇到了什么错误?
  • 据我所知,您正在尝试访问此链接:mysite/api/version1/Contacts/get/2 但路线正在注册:mysite/api/v1/Contacts/get/2
  • 我添加了错误
  • 使用url重写?将非版本重写为版本特定的 URL。

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


【解决方案1】:

如果为该请求提供服务的路由 ('api/v1/{controller}/{id}') 发现多个控制器定义为同名但命名空间不同,则会发生这种情况,这是不受支持的。

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

如果您想为同一个控制器提供两个 url,只需删除 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多