WebApi.Models.VersionHttpControllerSelector”的方法“SelectController”没有实现。
背景交代:
WebApi为了实现根据不同的版本,跳转不同的接口地址 ,重写了IHttpControllerSelector
重写的类 类似于 https://www.cnblogs.com/tx720/p/7666356.html
里面有一个SelectController方法,之前一直没报错
/// <summary> /// 对应于自定义控制选择器的命名空间, /// 将从HTTP请求消息中获取命名空间和控制器 /// 然后在字典中查找匹配的控制器 /// </summary> /// <param name="request"></param> /// <returns></returns> public HttpControllerDescriptor SelectController(HttpRequestMessage request) { }
今天更新接口的时候,本地未跑起来测试,而是编译通过后直接替换文件到服务器测试接口,结果一运行提示某dll找不到。
按照以往的经验,我只是简单的在webconfig将
System.Net.Http,从默认高版本,改为了提示错误的4.0.0.0
又把System.Runtime,从默认高版本,改为了提示错误的 4.0.0.0
改完后本地运行正常, 发布到服务器测试环境就提示 WebApi.Models.VersionHttpControllerSelector”的方法“SelectController”没有实现。
而这个方法就没有更改过。然后就怀疑是否是引进了计划任务类导致冲突,本来准备去掉更新的任务计划相关代码后测试。
后来就想试试看本地System.Net.Http和System.Runtime的实际版本
结果一看发现本地版本都高于4.0.0.0
修改webconfig为本地版本后,本地正常,更新到服务器测试版本 运行正常,问题解决。
<dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" /> </dependentAssembly>
后记:更新服务器接口时切记备份原来的文件,以防替换文件导致接口挂掉!!!(即使在本地正常, 也不能保证在服务器就一定正常)