.NET Core 3.1 Azure函数调用.NET Framework方法访问Always Encrypted列报错
问题解决:.NET Core 3.1 Azure函数调用.NET Framework类库访问Always Encrypted数据库异常
问题场景
我们有一个基于.NET Core 3.1的Azure函数,调用另一个.NET Framework 4.7.2类库的方法访问带Always Encrypted加密列的SQL Server数据库时,遇到两个异常:
- 使用
System.Data.SqlClient时,抛出:System.ArgumentException: 'Keyword not supported: 'column encryption setting'.' - 替换为
Microsoft.Data.SqlClient 5.1后,抛出:System.TypeInitializationException: 'The type initializer for 'Microsoft.Data.SqlClient.SqlConnection' threw an exception.' MissingMethodException: Method not found: 'System.Security.CodeAccessPermission System.Data.Common.DbProviderFactory.CreatePermission(System.Security.Permissions.PermissionState)'.
未启用列加密时,整个架构运行正常。
原因分析
- System.Data.SqlClient的局限性:旧版
System.Data.SqlClient不支持Always Encrypted所需的Column Encryption Setting连接字符串参数,必须使用Microsoft.Data.SqlClient才能启用该功能。 - Microsoft.Data.SqlClient版本兼容性问题:5.x版本的
Microsoft.Data.SqlClient针对.NET 5+和.NET Core做了优化,移除了对.NET Framework专属API(如System.Security.CodeAccessPermission)的依赖,但.NET Framework 4.7.2的类库引用该版本后,被.NET Core 3.1的Azure函数调用时,会因为.NET Core中不存在这些API而触发找不到方法的异常。
解决方案
1. 降级Microsoft.Data.SqlClient到兼容版本
选择同时支持.NET Framework 4.7.2和.NET Core 3.1的版本,推荐使用3.x系列(如3.1.0):
- 在.NET Framework 4.7.2类库项目中,卸载当前的
Microsoft.Data.SqlClient5.1,安装3.1.0版本 - 确保Azure函数项目也引用相同版本的
Microsoft.Data.SqlClient,避免版本冲突 - 验证连接字符串中的
Column Encryption Setting=enabled参数是否正常生效
2. 将.NET Framework类库升级为.NET Standard
把.NET Framework 4.7.2的类库迁移到.NET Standard 2.0(.NET Core 3.1和.NET Framework 4.7.2都支持该版本):
- 新建.NET Standard 2.0类库,将原有代码迁移过去
- 引用兼容.NET Standard的
Microsoft.Data.SqlClient版本(3.x或4.x) - Azure函数和原.NET Framework项目都可以直接引用这个类库,消除跨框架API差异
3. 直接在Azure函数中处理数据库访问
如果业务允许,将访问带Always Encrypted数据库的逻辑直接迁移到Azure函数项目中:
- 在.NET Core 3.1的Azure函数中引用
Microsoft.Data.SqlClient3.x版本 - 配置连接字符串和Azure Key Vault访问权限(如果使用AKV存储加密密钥)
- 避免跨框架调用带来的兼容性问题
额外注意事项
- 确保Azure函数拥有访问Azure Key Vault的权限(如果Always Encrypted使用AKV保存列加密密钥),需要配置系统托管标识或服务主体权限
- 验证数据库连接字符串中的
Column Encryption Setting=enabled参数拼写正确 - 清理项目的NuGet缓存,避免残留的旧版本依赖导致冲突
内容的提问来源于stack exchange,提问作者brandonwsl
相关产品推荐
相关产品推荐

