为何部署C# Web项目时提示缺少Microsoft.Web.Infrastructure.dll
问题原因
- 依赖链传递引用的复制配置问题:你检查项目A的csproj没有对应引用属于正常情况,问题出在项目B的引用配置:项目B对
Microsoft.Web.Infrastructure的引用属性中,「复制本地(Copy Local)」被设置为False。这种配置下,编译阶段该程序集不会被复制到项目B的输出目录,更不会被传递复制到依赖项目B的项目A的bin目录。你本地开发环境的全局程序集缓存(GAC)中默认预装了该程序集,因此本地调试运行时可以正常加载,不会触发报错。 - 服务器运行环境缺失对应程序集:目标服务器的GAC中没有安装
Microsoft.Web.Infrastructure程序集,ASP.NET运行时加载依赖链中的程序集时,会优先查找GAC,找不到再查找应用bin目录,两个位置都找不到就会抛出你遇到的文件找不到异常。 - Web.config绑定规则触发主动加载:如果你的项目A的Web.config中存在针对
Microsoft.Web.Infrastructure的绑定重定向规则,哪怕你没有直接引用该程序集,运行时也会主动尝试加载指定版本的程序集,进一步触发找不到文件的错误。
解决办法
- 打开项目B的引用列表,找到
Microsoft.Web.Infrastructure的引用项,右键打开属性,将「复制本地」改为True,重新编译解决方案后,该dll会被自动复制到项目A的bin目录,部署时带上即可。 - 如果不想修改项目B的配置,可以直接在项目A中添加对
Microsoft.Web.Infrastructure的NuGet引用,引用后默认复制本地为True,编译时会自动生成到bin目录。 - 如果允许修改服务器系统环境,也可以直接在服务器的GAC中安装对应版本的
Microsoft.Web.Infrastructure程序集,无需修改项目配置。
内容的提问来源于stack exchange,提问作者eric.bryan
相关产品推荐
相关产品推荐

