HttpControllerSelector替换不适用于参考库

时间:2016-02-03 14:25:39

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

我在使用什么

  • .NET 4.5.2
  • Web API 2

我正在使用一些例子 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!一切正常。

我试过谷歌搜索这个并问我办公室的其他几位高级开发人员。我们没有人知道为什么我不能直接在项目中使用它作为参考经文。

任何??

0 个答案:

没有答案