我在使用什么
我正在使用一些例子 ASP.NET API working with Areas - 我实际上并没有做区域,而是尝试进行版本控制。 所以现在代码......
这是我在Global.asax中的Application_Start:
namespace WebApiVersioning
{
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new VersionedHttpControllerSelector(GlobalConfiguration.Configuration));
}
}
}
这是自定义的HttpControllerSelector:
namespace WebApiVersioning.PipeLine
{
public class VersionedHttpControllerSelector : DefaultHttpControllerSelector
{
private const string VersionHeaderName = "API-Version";
private readonly HttpConfiguration _configuration;
private readonly Lazy<ConcurrentDictionary<string, Type>> _apiControllerTypes;
public VersionedHttpControllerSelector(HttpConfiguration configuration) : base(configuration)
{
_configuration = configuration;
_apiControllerTypes = new Lazy<ConcurrentDictionary<string, Type>>(GetControllerTypes);
}
private static string GetVersionHeader(HttpRequestMessage request)
{
IEnumerable<string> headerValues;
if (request.Headers.TryGetValues(VersionHeaderName, out headerValues) && headerValues.Count() == 1)
{
return headerValues.First();
}
throw new Exception($"{VersionHeaderName} not found.");
}
private static ConcurrentDictionary<string, Type> GetControllerTypes()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var types = assemblies
.SelectMany(a =>
a.GetTypes().Where(t =>
!t.IsAbstract &&
t.Name.EndsWith(ControllerSuffix) &&
typeof(IHttpController).IsAssignableFrom(t)))
.ToDictionary(t => t.FullName, t => t);
return new ConcurrentDictionary<string, Type>(types);
}
private HttpControllerDescriptor GetApiController(HttpRequestMessage request)
{
var controllerName = GetControllerName(request);
var version = GetVersionHeader(request);
if (string.IsNullOrEmpty(version))
{
return null;
}
if (version.Contains("."))
{
version = version.Replace(".", "");
}
var type = GetControllerTypeByVersion(version, controllerName);
return type == null ? null : new HttpControllerDescriptor(_configuration, controllerName, type);
}
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
return GetApiController(request) ?? base.SelectController(request);
}
private Type GetControllerTypeByVersion(string version, string controllerName)
{
var versionNameToFind = $".Version{version.ToLower()}.";
var controllerNameToFind = $".{controllerName}{ControllerSuffix}";
var query = _apiControllerTypes.Value.AsEnumerable();
var controller =
query.Where(
t =>
t.Key.ToLower().Contains(versionNameToFind.ToLower()) &&
t.Key.EndsWith(controllerNameToFind, StringComparison.OrdinalIgnoreCase))
.Select(t => t.Value).FirstOrDefault();
return controller;
}
}
}
这是问题所在。 我最初在一个单独的库中安装了VersionedHttpControllerSelector,并在WebAPI项目中引用它。当我试图访问它时,我得到一个错误,我错过了一个方法。它说我缺少VersionedHttpControllerSelector上的构造函数方法。我检查确保使用相同的.NET版本,我清理了我的箱子,并确保所有库的最新版本正在使用。我回收了IIS。我试图设置一个断点(从未命中)并在调试模式下运行。我甚至试着打开电脑然后再打开......没事!
我删除了Web API Project中的引用,并将VersionedHttpControllerSelector.cs编译为Web API Project。修复了Global.asax.cs文件中的引用。 BAM!一切正常。
我试过谷歌搜索这个并问我办公室的其他几位高级开发人员。我们没有人知道为什么我不能直接在项目中使用它作为参考经文。
任何??