C# 找到多个与控制器匹配的类型

C# 找到多个与控制器匹配的类型,c#,asp.net,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,C#,Asp.net,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我正在尝试使用标题进行api版本控制,但是在不同的文件夹结构中如下所示 在Controller文件夹中,在CustomerController.cs 及 在Controller文件夹中,在CustomerController.cs 当我使用上面的URL访问用户api版本时,效果很好 我的问题是,当我用标题尝试这种方法时,它给了我以下错误: {“消息”:“发生错误。”,“异常消息”: “找到多个与名为“customer”的控制器匹配的类型。 如果为该请求提供服务的路由 ('api/{control

我正在尝试使用
标题
进行
api版本控制
,但是在
不同的文件夹结构中
如下所示

Controller文件夹
中,在
CustomerController.cs

Controller文件夹
中,在
CustomerController.cs

当我使用上面的
URL
访问用户api版本时,效果很好

我的问题是,当我用
标题尝试这种方法时,它给了我以下错误:

{“消息”:“发生错误。”,“异常消息”: “找到多个与名为“customer”的控制器匹配的类型。 如果为该请求提供服务的路由 ('api/{controller}/{id}')找到了使用定义的多个控制器 名称相同但名称空间不同,这是不受支持的。\r\n\r\n “客户”请求已找到以下匹配项 控制器:\r\n版本.controllers.V1.CustomerController\r\n版本.controllers.V2.CustomerController,“异常类型”:“System.InvalidOperationException”,“StackTrace”: 在 System.Web.Http.Dispatcher.DefaultHttpControllerSelector.SelectController(HttpRequestMessage 请求)\r\n在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext() }

WebApiConfig.cs

 public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
CustomeControllerSelector.cs

        public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            var controllers = GetControllerMapping();
            var routeData = request.GetRouteData();
            var controllerName = routeData.Values["controller"].ToString();
            //HttpControllerDescriptor controllerDescriptor;

            var version = GetVersionFromAcceptHeaderVersion(request);
            var controllerKey = String.Format(CultureInfo.InvariantCulture, "{0}.{1}",
                        version, controllerName);


            //if (controllers.TryGetValue(controllerName, out controllerDescriptor))
            // {

            if (!string.IsNullOrEmpty(version))
            {
                HttpControllerDescriptor versionedControllerDescriptor;
                if (controllers.TryGetValue(controllerKey, out versionedControllerDescriptor))
                {
                    return versionedControllerDescriptor;
                }
            }
            return null;
        }

          private string GetVersionFromAcceptHeaderVersion(HttpRequestMessage request)
        {
            var acceptHeader = request.Headers.Accept;
            foreach (var mime in acceptHeader)
            {
                if (mime.MediaType == "application/json" || mime.MediaType == "text/html")
                {
                    var version = mime.Parameters
                                    .Where(v => v.Name.Equals("version", StringComparison.OrdinalIgnoreCase))
                                    .FirstOrDefault();
                    if (version != null)
                    {
                        return version.Value;
                    }
                    return string.Empty;
                }
            }
            return string.Empty;
        }

我试着跟着。截至目前为止的工程-

public class CustomControllerSelector : DefaultHttpControllerSelector
{
    //const string partName = "Webapi.Controllers";
    private readonly HttpConfiguration _config;

    public CustomControllerSelector(HttpConfiguration config)
        : base(config)
    {
        _config = config;
    }

    public override System.Web.Http.Controllers.HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        var _route = request.GetRouteData();

        var controllerName = base.GetControllerName(request);

        var type = _config.Services.GetAssembliesResolver();
        var controlles = _config.Services.GetHttpControllerTypeResolver().GetControllerTypes(type);

        object name;
        _route.Values.TryGetValue("route", out name);

        //No more hard coding
        var partName = controllers.FirstOrDefault().Namespace;
        var st = name as string;
        if (st != null)
        {
            var conType = controlles.FirstOrDefault(a => a.Namespace == string.Format("{0}.{1}", partName, st));
                        if (conType != null)
                            return new System.Web.Http.Controllers.HttpControllerDescriptor(_config, controllerName, conType);
        }

        return base.SelectController(request);
    }
}
在WebApiConfig.cs中-

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

http://localhost:60957/api/Another/Route/a
http://localhost:60957/api/Another/Route2/aaaaa

不,我的电话是
http://localhost:58892/api/customer
和标题中的
accept:application/json;version=1
您所做的是静态的:(检查我的类
CustomeControllerSelector.cs
是的,当控制器位于控制器文件夹
CustomerV1Controller.cs
CustomerV2Controller.cs
中并且代码是
var versionedControllerName=string.Concat(控制器名称,“V”,版本);HttpControllerDescriptor versionedControllerDescriptor;if(controllers.TryGetValue(versionedControllerName,out versionedControllerDescriptor)){返回versionedControllerDescriptor;}
什么是
Webapi.Controllers
在我的代码中我没有使用它。这是我的控制器名称空间的常见部分。您需要更改路由代码,以包括
路由
部分。我也在寻找相同的部分。如果找到,将更新。