添加绑定重定向后仍无法加载程序集,Web API调用报错求助
遇到这种明明配置了绑定重定向却还是报版本不匹配的问题,我给你列几个最常见的排查方向,按顺序试试应该能找到根因:
先确认绑定重定向的配置位置和格式是否正确
很多时候配置没生效是因为放错了节点或者格式有问题。这段配置必须放在web.config的<runtime>-><assemblyBinding>节点下,而且标签要正确闭合,别漏了xmlns属性,否则配置可能不被识别:<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.CommonSchema.Services" publicKeyToken="872fbc9102191257" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" /> </dependentAssembly> <!-- 其他绑定重定向配置 --> </assemblyBinding> </runtime>检查运行目录里的实际dll版本
packages.config里显示有4.2.0.0不代表运行时加载的就是这个版本。去你的项目输出目录(比如bin\Debug或者服务器部署文件夹)找到Microsoft.CommonSchema.Services.dll,右键查看属性→详细信息,确认文件版本和产品版本是不是4.2.0.0。有时候发布时没更新dll,或者旧版本残留,都会导致这个问题。用程序集绑定日志工具追踪绑定过程
这是最靠谱的排查方法,能直观看到程序集加载的每一步。打开Visual Studio开发者命令提示符(记得以管理员身份运行),输入命令:fuslogvw.exe在工具里设置“记录到磁盘”,然后重现错误。之后就能看到详细的绑定日志,比如它尝试加载哪个版本、为什么找不到、绑定重定向有没有被应用,直接定位问题所在。
检查是否有配置文件覆盖了你的设置
如果是Web项目,发布时可能会用web.release.config之类的转换文件修改原配置。打开这些转换文件,看看有没有移除或者修改这段绑定重定向的代码。另外,在IIS里运行的话,也要确认站点指向的是你修改过的web.config,而不是其他备份文件。验证程序集的PublicKeyToken是否完全匹配
虽然你配置里的Token和报错里的一致,但还是可以验证一下本地dll的Token是否正确。用命令提示符运行:sn -T "你的dll路径\Microsoft.CommonSchema.Services.dll"对比输出的Token和配置里的是否完全一致,避免复制粘贴时的字符错误。
排查是否有传递依赖强制要求旧版本
可能你的项目里某个其他NuGet包依赖的是4.1.0.0版本,而且这个依赖没有被绑定重定向覆盖。可以用Visual Studio的“依赖项”面板查看所有引用的程序集,或者用dotnet list package --include-transitive(如果是.NET Core/5+项目)查看所有传递依赖,看看有没有哪个包明确要求4.1.0.0版本。
内容的提问来源于stack exchange,提问作者SKLAK

