[英]Azure Function deploy error: Your function app is targeting V1, but Azure host has function version V2,
[英]Enable Column Encryption Azure Function App v2 Error
目前有許多 Azure 函數在 V1 上運行並希望開始遷移到 v2,但是我遇到了通過 sqlstringbuilder 啟用列加密的問題。
如果我注釋掉啟用列加密屬性 function 執行良好並返回加密的數據。
我需要啟用列加密屬性,以便它返回已解密的數據。
#load "Serialize.csx"
#r "System.Configuration"
#r "System.Data"
#r "Newtonsoft.Json"
using System.Configuration;
//using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;
using System.Text;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Configuration;
//using Microsoft.Data.SqlClient
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
string connectionString = @"Data Source = #####################;
SqlConnectionStringBuilder connStringBuilder = new SqlConnectionStringBuilder(connectionString);
// THIS LINE IS CAUSING THE ERROR
connStringBuilder.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
connectionString = connStringBuilder.ConnectionString;
string json = " ";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
SqlDataReader dataReader;
cmd.CommandText = "SELECT * FROM Encrypted5";
cmd.Connection = conn;
dataReader = cmd.ExecuteReader();
var r = Serialize(dataReader);
json = JsonConvert.SerializeObject(r, Formatting.Indented);
conn.Close();
}
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(json, Encoding.UTF8, "application/json")
};
}
啟用時產生的錯誤消息:
2019-11-02T21:30:29.124 [錯誤] run.csx(29,19):錯誤 CS1061:“SqlConnectionStringBuilder”不包含“ColumnEncryptionSetting”的定義,並且沒有擴展方法“ColumnEncryptionSetting”接受“類型”的第一個參數可以找到 SqlConnectionStringBuilder'(您是否缺少 using 指令或程序集引用?)
2019-11-02T21:30:29.295 [錯誤] run.csx(29,45):錯誤 CS0103:當前上下文中不存在名稱“SqlConnectionColumnEncryptionSetting”
我相信您必須使用 System.Data.SqlClient 版本 4.5.1,它沒有設置列加密的屬性:
您可以為更新的框架升級框架,或者您可以簡單地 append 連接字符串本身的設置:
string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
SqlConnection connection = new SqlConnection(connectionString);
另外檢查以下文檔以供進一步參考:
Azure Function - 此平台不支持 System.Data.SqlClient
希望能幫助到你。
根據我的研究,如果我們想使用設置ColumnEncryptionSetting
來啟用 Always Encrypted with。 net core,我們應該使用 SDK Microsoft.Data.SqlClient
。 更多詳細信息,請參閱博客和問題。 例如我的代碼
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
string connectionString = @"";
SqlConnectionStringBuilder connStringBuilder = new SqlConnectionStringBuilder(connectionString);
connStringBuilder.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
string str = "";
using (SqlConnection connection = new SqlConnection(connStringBuilder.ConnectionString))
{
connection.Open();
string sql = "select * from dbo.Student";
using (SqlCommand command = new SqlCommand(sql, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
str += reader.GetString(0) + " " + reader.GetString(1) + "\n";
}
}
}
}
return
(ActionResult)new OkObjectResult(str);
}
}
如果您在開發 function 時遇到錯誤Microsoft.Data.SqlClient is not supported on this platform
。 請將以下腳本添加到 csproj 文件中。 更多詳情,請參閱文檔
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy $(OutDir)$(ProjectName).deps.json $(OutDir)bin\function.deps.json" />
</Target>
<Target Name="PostPublish" BeforeTargets="Publish">
<Exec Command="copy $(PublishDir)$(ProjectName).deps.json $(PublishDir)bin\function.deps.json" />
<Exec Command="move $(PublishDir)\runtimes $(PublishDir)\bin" />
</Target>
此外,您還可以使用 ODBC 驅動程序。 ODBC 驅動程序支持始終加密。 例如
using (var connection = new OdbcConnection(
"Driver={ODBC Driver 17 for SQL Server};;Server={server name};Trusted_Connection=yes;ColumnEncryption=Enabled;Database={DBname};"))
{
using (var cmd = new OdbcCommand("", connection))
{
connection.Open();
Console.WriteLine("Connected");
Console.WriteLine("SSN: " + Convert.ToString(cmd.ExecuteScalar()));
Console.ReadLine();
connection.Close();
}
}
更多詳情,請參閱
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.