You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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数据库时,遇到两个异常:

  1. 使用System.Data.SqlClient时,抛出:
    System.ArgumentException: 'Keyword not supported: 'column encryption setting'.'
    
  2. 替换为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)'.
    

未启用列加密时,整个架构运行正常。

原因分析

  1. System.Data.SqlClient的局限性:旧版System.Data.SqlClient不支持Always Encrypted所需的Column Encryption Setting连接字符串参数,必须使用Microsoft.Data.SqlClient才能启用该功能。
  2. 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.SqlClient 5.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.SqlClient 3.x版本
  • 配置连接字符串和Azure Key Vault访问权限(如果使用AKV存储加密密钥)
  • 避免跨框架调用带来的兼容性问题

额外注意事项

  • 确保Azure函数拥有访问Azure Key Vault的权限(如果Always Encrypted使用AKV保存列加密密钥),需要配置系统托管标识或服务主体权限
  • 验证数据库连接字符串中的Column Encryption Setting=enabled参数拼写正确
  • 清理项目的NuGet缓存,避免残留的旧版本依赖导致冲突

内容的提问来源于stack exchange,提问作者brandonwsl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:17:37