我们有在 .net core 3.1 上运行的 azure 函数,我们有在 .net framework 4.7.2 上运行的单独项目的方法,我们正在尝试使用从 azure 函数调用的 .net framework 4.7.2 中的方法来访问具有使用 Always Encrypted 的加密列的数据库。当尝试创建 Microsoft.Data.SqlClient.SqlConnection 的新实例时,我们遇到异常:
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)'.
连接字符串包含“Column Encryption Setting=enabled”
.net framework 4.7.2 ProjectA中的方法示例
public static string MethodA()
{
string ssn = "";
try
{
string sql = @" SELECT TOP 1 SSN FROM DBO.TESTAETABLE";
List<SqlParameter> parameters = new List<SqlParameter>();
using (Microsoft.Data.SqlClient.SqlDataReader reader = DBManager.ExecuteReaderMS(sql, parameters.ToArray()))
{
while (reader.Read())
ssn = Convert.ToString(reader["SSN"]);
}
}
catch (Exception e)
{
string error = e.ToString();
}
return ssn;
}
Azure 函数示例
[FunctionName("TestFunction")]
public static Task Run([ServiceBusTrigger("testfunction", Connection = "testconnection")]Message myQueueItem, ILogger log)
{
try
{
string aType = Convert.ToString(myQueueItem.UserProperties["type"]);
string aResourceName = Convert.ToString(myQueueItem.UserProperties["name"]);
int aResult = 0;
string aMessage = null;
if (aType == "AKVTEST")
{
string anSSN = ProjectA.ClassA.MethodA();
return Task.CompletedTask;
}
log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem.Body} for type: {aType}");
return null;
}
catch (Exception Ex)
{
log.LogInformation($"C# ServiceBus queue trigger function EXCEPTION: {Ex.ToString()}");
return null;
}
}
试图将 System.Data.SqlClient 引用更改为 Microsoft.Data.SqlClient(包版本 5.1),我们收到了上述异常。
在此更改之前,在使用 System.Data.SqlClient 时,我们遇到以下异常:
System.ArgumentException: 'Keyword not supported: 'column encryption setting'.'