Подтвердить что ты не робот

Строка подключения базы данных Azure

Как добавить или получить доступ к файлу app.config в функциях Azure, чтобы добавить строку подключения к базе данных?

Если вы не должны добавлять app.config и есть лучший способ получить доступ к внешней базе данных для выполнения функции, пожалуйста, дайте мне знать лучшие практики. Спасибо!

4b9b3361

Ответ 1

Jan_V почти прибил его, что привело меня к эксперименту с этим в local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}

Это позволяет использовать ConfigurationManager.ConnectionStrings[], к которому мы все привыкли.

var sqlConnection = ConfigurationManager
                   .ConnectionStrings["MyConnectionString"].ConnectionString;

Ответ 2

Лучший способ сделать это - добавить строку соединения с портала Azure:

  • В пользовательском интерфейсе приложений приложений нажмите "Параметры приложения-приложения"
  • Настройки/Настройки приложения
  • Добавить строки подключения

Затем они будут доступны с использованием той же логики, как если бы они были в файле web.config, например

var conn = System.Configuration.ConfigurationManager
                 .ConnectionStrings["MyConn"].ConnectionString;

Или, если вы используете язык не .NET, вместо этого вы можете использовать настройки приложения, которые становятся простыми переменными среды во время выполнения, к которым могут обращаться ваши функции.

Ответ 3

Диспетчер конфигурации будет заменен новой системой конфигурации ядра Asp.Net в функции Runtime v2.

Поэтому, если вы используете .Net Core, вы должны следовать статье блога Джона Галлантса: https://blog.jongallant.com/2018/01/azure-function-config/

  • Работает с local.settings.json и настройками в функции Azure
  • Работает с настройками приложения и строками подключения

Ответ 4

Я прошел несколько похожих вопросов и ответов здесь. Многие из них либо вводят в заблуждение, либо предполагают, что все находятся на одном уровне и понимают, как работают функции лазури. нет ответа для новичков, как я. Я хотел бы суммировать здесь мое решение шаг за шагом.

  1. самое главное, мы понимаем, что файл local.settings.json НЕ ДЛЯ AZURE. оно должно запускать ваше приложение в локальной сети, как ясно видно из названия. Таким образом, решение не имеет ничего общего с этим файлом.

  2. App.Config или Web.Config не работают со строками подключения функций Azure. Если у вас есть библиотека уровня базы данных, вы не можете перезаписать строку подключения, используя любую из них, как в приложениях Asp.Net.

  3. Чтобы работать с ним, вам необходимо определить строку подключения на портале Azure в Application Settings в вашей функции Azure. Есть строки подключения. там вы должны скопировать строку подключения вашего DBContext. если это edmx, это будет выглядеть так, как показано ниже. Существует тип подключения, я использую его SQlAzure, но я тестировал с Custom (кто-то утверждал, что работает только с Custom) работает с обоими.

metadata = res:///Models.myDB.csdl | res:///Models.myDB.ssdl | res://*/Models.myDB.msl; provider = System.Data.SqlClient; строка подключения поставщика = 'data source = [yourdbURL]; исходный каталог = myDB; постоянная информация о безопасности = True; идентификатор пользователя = xxxx; пароль = xxx; MultipleActiveResultSets = True; App = EntityFramework

  1. После того, как вы это настроите, вам нужно прочитать URL в вашем приложении и предоставить DBContext. DbContext реализует конструктор с параметром строки подключения. По умолчанию конструктор не имеет параметров, но вы можете расширить его. если вы используете классы POCO, вы можете просто изменить класс DbContext. Если вы используете сгенерированные базой данных классы Edmx, как я, вы не хотите трогать автоматически сгенерированные классы edmx, вместо этого вы хотите создать частичный класс в том же пространстве имен и расширить этот класс, как показано ниже.

Это автоматически сгенерированный 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());
            }
        }
    }
  1. В конце концов, вы можете получить строку подключения из настроек Azure, в своем проекте функции Azure с приведенным ниже кодом и предоставить своему DbContext myDBEntities имя, которое вы дали на портале Azure для вашей строки подключения.
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString;


 using (var dbContext = new myDBEntities(connString))
{
        //TODO:
}

Ответ 5

Тодд де Лэнд ответ работает только для местной среды. Однако согласно этому документу опубликованная функция Azure должна сохранять строки подключения в качестве параметров приложения и получать их с помощью GetEnvironmentVariable.

Добавление ссылки на сборку System.Configuration не требуется.

string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);

Вот шаги, чтобы сделать строки среды извлекаемыми как для локальной, так и для опубликованной среды.

  1. Для поддержки локальной среды в local.settings.json укажите строки подключения внутри узла " Values

local.settings.json picture

  1. Для поддержки опубликованной среды перейдите на portal.azure.com > your Azure Function > function node > Application Settings

Application Settings

Add MyConnectionString

  1. Наконец, вызовите GetEnvironmentVariable из вашей функции Azure (не могу получить stackoverflow, чтобы правильно отобразить этот код)

enter image description here

Это оно.

Ответ 6

Я считаю, что обычной практикой являются переменные среды использования для функций azure, тогда вы можете настроить переменные среды в Azure Function:

(Настройки приложения-приложения → Настройка параметров приложения → Раздел настроек приложения)

Возможно, было бы более полезно, если вы также можете сообщить нам, какой язык вы используете?

Ответ 7

Попробуйте этот метод.

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;
}

Ответ 8

некоторые из вышеперечисленных предложений работают. Однако есть более простой способ установки строки подключения. Именно при использовании экрана публикации публикуются после нажатия на настройку публикации. см. рисунок из документации здесь enter image description here

Ответ 9

Один важный момент, который здесь не особо упоминается, заключается в том, что раздел "Строка подключения" и пары "ключ/значение", созданный на портале Azure, будут игнорироваться, если в файле local.settings.json нет ключа с тем же именем.

Когда вы устанавливаете строку соединения через лазурный портал с именем "sql_db" и устанавливаете значение, оно будет IGNORED, если вы явно не поместите его в файл local.settings.json.

EX. var str = ConfigurationManager.ConnectionStrings [ "sql_db" ]. ConnectionString;

выдаст ошибку, если она не включена в оба.

Итак, полный ответ для функций Azure: добавьте значение строки/пары в строку строки подключения через порт Azure и добавьте значение ключа/пары с тем же именем в файл local.settings.json.

Надеюсь, это поможет кому-то.

Ответ 10

Ниже помогли мне как локально, так и в Azure для функции триггера http, которая запрашивает базу данных cosmos.

добавлена ссылка на пакет проекта nuget для Microsoft.Azure.WebJobs.Extensions.CosmosDB

Настройки строки подключения:

local.settings.json

{
  "ConnectionStrings": {
    "CosmosDBConnection": "AccountEndpoint=foobar;"
  }
}

в портале Azure> приложения функций> функции платформы> конфигурации> настройки приложения> настройки нового приложения> Name: CosmosDBConnection Value: AccountEndpoint=foobar; обновить> сохранить

пример С# Azure функция

public static async Task<IActionResult> Run(
           [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
           [CosmosDB(databaseName:"dbName",
                     collectionName:"collectionName",
                     ConnectionStringSetting = "CosmosDBConnection")] DocumentClient documentClient, 
           ILogger log){
             .....
           }

Ответ 11

Я попробовал приведенный ниже фрагмент кода в моей локальной базе данных, который кажется простым. Давай посмотрим.

Расширение Nuget:

Загрузите следующую ссылку из 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;"
  }
}

Считать соединение в теле функции:

//Чтение базы данных Connection

        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 просто замените строку local.settings.json файле local.settings.json. Это будет работать соответственно. Смотрите скриншот ниже:

enter image description here

Ответ 12

System.Configuration.ConfigurationManager больше не работает с функциями Azure. Вместо этого следует использовать ExecutionContext из Azure.WebJobs и импортировать контекст с настройками из Azure в качестве параметра в методе Run.

Взгляните на это объяснение: https://blog.jongallant.com/2018/01/azure-function-config/

Ответ 13

Вам следует сохранить строку подключения в хранилище ключей Azure и включить MSI для функции Azure, а также добавить политику доступа в хранилище ключей Azure для чтения значения ключа.