我試圖api versioning
使用header
但在different folder structure
像下面。發現多個類型與控制器匹配
在Controller folder
有內部的CustomerController.cs
是CustomerController.cs
和
在Controller folder
有V2
子文件夾內V1
子文件夾時,上面使用URL
我的用戶API版本工作正常。
我的問題是,當我嘗試這種方法與header
它給我下面的錯誤:
{ "Message": "An error has occurred.", "ExceptionMessage": "Multiple types were found that match the controller named 'customer'. This can happen if the route that services this request ('api/{controller}/{id}') found multiple controllers defined with the same name but differing namespaces, which is not supported.\r\n\r\nThe request for 'customer' has found the following matching controllers:\r\nApiVersion.Controllers.V1.CustomerController\r\nApiVersion.Controllers.V2.CustomerController", "ExceptionType": "System.InvalidOperationException", "StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerSelector.SelectController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.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;
}
沒有我的電話是一樣通過'http://本地主機:58892/API /客戶'和在頭'接受:應用程序/ JSON;版本= 1' 你做的是靜態:(檢查我的類'CustomeControllerSelector.cs ' – Neo
這是一個有效的'接受'頭? –
是的,當Controller在控制器文件夾'CustomerV1Controller.cs'和'CustomerV2Controller.cs'中時工作正常,代碼爲 'var versionedControllerName = string.Concat(controllerName,「V」,version); HttpControllerDescriptor versionedControllerDescriptor; (controllers.TryGetValue(versionedControllerName,out versionedControllerDescriptor)) { return versionedControllerDescriptor; }' – Neo