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
在我的代码中我没有使用它。这是我的控制器名称空间的常见部分。您需要更改路由代码,以包括路由
部分。我也在寻找相同的部分。如果找到,将更新。