ASP.NET Core 2.0项目发布Azure报System.Data.SqlClient版本不匹配错误
这个问题我之前帮几个开发者解决过,本质是依赖版本冲突+Azure部署时的文件残留/配置问题导致的——本地正常是因为开发环境的绑定重定向和缓存机制帮你处理了,但Azure环境需要更明确的配置。下面是几个一步步的解决方案,按顺序试应该能搞定:
1. 手动添加绑定重定向,强制指定版本
在你的ASP.NET Core主项目的web.config文件里,找到<runtime>节点(如果没有就新建),添加针对System.Data.SqlClient的绑定重定向,强制所有请求都指向4.4.3版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Data.SqlClient" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.4.3.0" newVersion="4.4.3.0" /> </dependentAssembly> </assemblyBinding> </runtime>
如果是.NET Standard类库,确保它们的app.config里也有同样的配置,或者在主项目的.csproj里添加:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
这会自动生成正确的绑定重定向配置。
2. 确保所有项目都直接引用System.Data.SqlClient 4.4.3
很多时候问题出在传递依赖:某个第三方包可能间接引用了旧版本的System.Data.SqlClient,导致发布时旧版本DLL被打包进去。你需要给每个.NET Standard 2.0类库和主项目都手动安装4.4.3版本的NuGet包,而不是依赖其他包的间接引用。
在每个项目的.csproj里添加明确的引用:
<PackageReference Include="System.Data.SqlClient" Version="4.4.3" />
或者在NuGet包管理器里,找到System.Data.SqlClient,选择版本4.4.3并安装到所有相关项目。
3. 清理Azure App Service的旧部署文件
有时候发布操作不会完全覆盖旧文件,导致旧版本的System.Data.SqlClient.dll残留在Azure服务器上,和新版本冲突。你可以:
- 在Visual Studio的发布配置里,勾选删除目标中未存在的文件(在“文件发布选项”里),然后重新发布;
- 或者直接登录Azure门户,进入你的App Service,打开高级工具>Kudu,进入
site/wwwroot目录,找到System.Data.SqlClient.dll和System.Data.SqlClient.xml文件,手动删除后再重新发布。
4. 验证Azure的.NET Core运行时版本
确保Azure App Service上的.NET Core运行时版本和你本地开发环境一致。进入Azure门户的App Service>配置>常规设置,查看“.NET Core版本”,选择和你本地匹配的ASP.NET Core 2.0版本(比如2.0.9)。
5. 用全局配置统一强制版本
如果项目较多,可以在解决方案根目录新建一个Directory.Build.props文件,添加全局版本控制,强制所有项目使用指定版本的System.Data.SqlClient:
<Project> <ItemGroup> <PackageReference Update="System.Data.SqlClient" Version="4.4.3" /> </ItemGroup> </Project>
这个文件会被所有项目自动识别,确保整个解决方案的依赖版本统一。
这些步骤应该能解决版本不匹配的问题,核心思路就是明确指定版本+清理旧文件+强制绑定重定向,避免Azure环境加载到错误的DLL版本。
内容的提问来源于stack exchange,提问作者AlexB

