Azure関数でapp.config
ファイルを追加またはアクセスして、データベース接続文字列を追加するにはどうすればよいですか?
app.config
を追加する予定がなく、外部データベースにアクセスして機能を実行するより良い方法がある場合は、ベストプラクティスをお知らせください。ありがとう!
Jan_V almostそれを釘付けにしたので、local.settings.json
でこれを試してみました
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true;",
"AzureWebJobsDashboard": ""
},
"ConnectionStrings": {
"MyConnectionString": "[YourConnectionStringHere]"
}
}
これにより、私たちが慣れているConfigurationManager.ConnectionStrings[]
を使用できます。
var sqlConnection = ConfigurationManager
.ConnectionStrings["MyConnectionString"].ConnectionString;
これを行う最良の方法は、Azureポータルから接続文字列を追加することです。
これらは、web.configにあるかのように、同じロジックを使用して利用可能になります。
var conn = System.Configuration.ConfigurationManager
.ConnectionStrings["MyConn"].ConnectionString;
または、.NET以外の言語を使用している場合は、代わりにアプリ設定を使用できます。これは、実行時に関数がアクセスできる単純な環境変数になります。
機能ランタイムv2では、Configuration Managerは新しいAsp.Net Core Configuration Systemに置き換えられます。
したがって、.Net Coreを使用している場合は、John Gallantsブログの記事に従う必要があります。 https://blog.jongallant.com/2018/01/Azure-function-config/
ここでいくつかの同様の質問と回答を行いました。それらの多くは、誤解を招くか、全員が同じレベルにあり、Azureの機能がどのように機能しているかを理解していると想定しています。私のような初心者には答えがありません。ここで私のソリューションをステップごとにまとめたいと思います。
最も重要なことは、local.settings.jsonファイルを理解することです。AzureではISではありません。名前が明確に言っているように、ローカルでアプリを実行することです。したがって、解決策はこのファイルとは関係ありません。
App.ConfigまたはWeb.Configは、Azureの関数接続文字列に対して機能しません。データベースレイヤーライブラリがある場合、Asp.Netアプリケーションで行うように、これらのいずれかを使用して接続文字列を上書きすることはできません。
使用するには、Azure関数のApplication Settings
の下にあるAzureポータルで接続文字列を定義する必要があります。接続文字列があります。そこでDBContextの接続文字列をコピーする必要があります。 edmxの場合、次のようになります。接続タイプがあり、SQlAzureを使用しますが、Customでテストしました(誰かがカスタムでのみ動作すると主張しました)両方で動作します。
metadata = res:// /Models.myDB.csdl|res:///Models.myDB.ssdl | res://*/Models.myDB.msl; provider = System.Data.SqlClient ; provider connection string = 'data source = [yourdbURL]; initial catalog = myDB; persist security info = True; user id = xxxx; password = xxx; MultipleActiveResultSets = True; App = EntityFramework
これは自動生成されたDbContextです
namespace myApp.Data.Models
{
public partial class myDBEntities : DbContext
{
public myDBEntities()
: base("name=myDBEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
}
これは新しい部分クラスです。作成します
namespace myApp.Data.Models
{
[DbConfigurationType(typeof(myDBContextConfig))]
partial class myDBEntities
{
public myDBEntities(string connectionString) : base(connectionString)
{
}
}
public class myDBContextConfig : DbConfiguration
{
public myDBContextConfig()
{
SetProviderServices("System.Data.EntityClient",
SqlProviderServices.Instance);
SetDefaultConnectionFactory(new SqlConnectionFactory());
}
}
}
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString; using (var dbContext = new myDBEntities(connString)) { //TODO: }
トッドデランドの回答は、地域環境でのみ有効です。ただし、この doc ごとに、公開されたAzure Functionでは、接続文字列をアプリ設定として保存し、GetEnvironmentVariable
によって取得する必要があります。
System.Configuration
アセンブリ参照の追加は、不要です。
string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);
以下は、環境文字列をbothローカル環境と公開環境で取得可能にする手順です。
local.settings.json
で、Values
ノード内に接続文字列を指定しますportal.Azure.com > your Azure Function > function node > Application Settings
にアクセスしてくださいGetEnvironmentVariable
を呼び出します(このコードを正しく表示するには、stackoverflowを取得する必要があります)それでおしまい。
一般的なプラクティスは、Azure関数に環境変数を使用することであると考えています。その後、Azure関数で環境変数を設定できます。
(機能アプリ設定->アプリ設定の構成->アプリ設定セクション)
使用している言語をお知らせいただければ、さらに役立つと思いますか?
この方法を試してください。
public static string GetConnectionString(string name)
{
string conStr = System.Environment.GetEnvironmentVariable($"ConnectionStrings:{name}",
EnvironmentVariableTarget.Process);
// Azure Functions App Service naming
if (string.IsNullOrEmpty(conStr))convention
conStr = System.Environment.GetEnvironmentVariable($"SQLAZURECONNSTR_{name}",
EnvironmentVariableTarget.Process);
return conStr;
}
上記の提案のいくつかは機能します。ただし、接続文字列を設定するより簡単な方法があります。これは、公開設定を押した後に表示される「公開」画面を使用することによります。 こちらのドキュメントの図を参照
以下は、コスモスdbを照会するhttpトリガー関数について、ローカルとAzureの両方で機能しました
追加 Microsoft.Azure.WebJobs.Extensions.CosmosDB プロジェクトへのnugetパッケージ参照
接続文字列の設定:
local.settings.json
{
"ConnectionStrings": {
"CosmosDBConnection": "AccountEndpoint=foobar;"
}
}
inAzure portal>function apps>プラットフォーム機能>構成>アプリケーション設定>新しいアプリケーション設定> Name: CosmosDBConnection
Value: AccountEndpoint=foobar;
update>save
サンプルC#Azure関数
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
[CosmosDB(databaseName:"dbName",
collectionName:"collectionName",
ConnectionStringSetting = "CosmosDBConnection")] DocumentClient documentClient,
ILogger log){
.....
}
私はローカルデータベースで以下のコードスニペットを試してみましたが、簡単そうです。みてみましょう。
Nuget Extention:
Nuget Package Manager
プロジェクトからDependencies
パートから次のリファレンスをダウンロードします
using System.Data.SqlClient;
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"sqldb_connection": "Data Source=.;Initial Catalog=DatabaseName;Connection Timeout=30;Integrated Security=True;"
}
}
関数本体の読み取り接続:
//データベース接続の読み取り
var sqlConnection = Environment.GetEnvironmentVariable("sqldb_connection");
接続文字列を使用した関数読み取り書き込み操作:
// Convert all request perameter into Json object
var content = req.Content;
string jsonContent = content.ReadAsStringAsync().Result;
dynamic requestPram = JsonConvert.DeserializeObject<AzureSqlTableClass>(jsonContent);
// Validate required param
if (string.IsNullOrEmpty(requestPram.FirstName))
{
return req.CreateResponse(HttpStatusCode.OK, "Please enter First Name!");
}
if (string.IsNullOrEmpty(requestPram.LastName))
{
return req.CreateResponse(HttpStatusCode.OK, "Please enter Last Name!");
}
//Read database Connection
var sqlConnection = Environment.GetEnvironmentVariable("sqldb_connection");
var responseResults = 0;
//Read Write Uisng Connection String
using (SqlConnection conn = new SqlConnection(sqlConnection))
{
conn.Open();
var text = "INSERT INTO AzureSqlTable VALUES ('" + requestPram.FirstName + "', '" + requestPram.LastName + "', '" + requestPram.Email + "') ";
using (SqlCommand cmd = new SqlCommand(text, conn))
{
responseResults = await cmd.ExecuteNonQueryAsync();
}
conn.Close();
}
return req.CreateResponse(HttpStatusCode.OK, responseResults);
注:
Azure portal
で関数を公開しているときに、local.settings.json
ファイルの接続文字列を置き換えるだけです。それに応じて動作します。以下のスクリーンショットをご覧ください。