Исключение локальной конфигурации в функциях Azure v2 и MySQL - PullRequest
0 голосов
/ 02 мая 2018

[ Обновление : Действительно, в платформе функций Azure до выпуска v2 была ошибка, исправленная после сообщения об этом. ]

Кажется, есть проблема с инициализацией системы конфигурации при локальном запуске в последней версии Visual Studio 2017 и последней версии расширения функций Azure. Кроме того, этот проект использует V2 платформы функций Azure.

Исключение выдается, как только я пытаюсь открыть соединение MySQL с:

connection.Open();

Это исключение, которое возникает:

System.Private.CoreLib: Exception while executing function: MyAzureFunctionName. 
MySql.Data: The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception. 
MySql.Data: The type initializer for 'MySql.Data.MySqlClient.MySqlConfiguration' threw an exception.    
System.Configuration.ConfigurationManager: Configuration system failed to initialize. 
System.Configuration.ConfigurationManager: Unrecognized configuration section system.serviceModel. (*LocalPath*\AppData\Local\Azure.Functions.V2.Cli\func.dll.config line 204).

Он жалуется на нераспознанный раздел конфигурации. У меня есть local.settings.json файл, и он содержит несколько настроек приложения. Полная трассировка стека доступна здесь:

   at MySql.Data.MySqlClient.Replication.ReplicationManager.IsReplicationGroup(String groupName)
   at MySql.Data.MySqlClient.MySqlConnection.Open()
   at Internal.Functions.TestRemoteDatabaseConnection.Run(HttpRequest req, ILogger log, ExecutionContext context) in C:\Users\foo\Source\Repos\Functions\TestRemoteDatabaseConnection.cs:line xx

Вот полная функция теста:

using System;
using System.Configuration;
using System.Data;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;

namespace Internal.Functions
{
    public static class TestRemoteDatabaseConnection
    {
        [FunctionName("TestRemoteDatabaseConnection")]
        public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
            HttpRequest req, ILogger log)
        {
            log.LogInformation("Testing a remote database connection...");

            var connectionString = Environment.GetEnvironmentVariable("DATABASE_CONNECTION");

            using (var connection = new MySqlConnection(connectionString))
            {
                var sqlStatement = "SELECT 1";
                try
                {
                    connection.Open();
                }
                catch (Exception e)
                {
                    log.LogError(e, "Unable to create connection");
                    throw;
                }

                var cmd = new MySqlCommand()
                {
                    CommandText = sqlStatement,
                    Connection = connection,
                    CommandType = CommandType.Text,
                    CommandTimeout = 10800 // 3 minutes
                };

                var result = cmd.ExecuteScalar();

                return new OkObjectResult($"Connection succeeded to remote database connection.  Result: {result}");
            }
        }
    }
}

Фрагмент ссылки на пакет из файла .csproj:

  <ItemGroup>
    <PackageReference Include="Analytics" Version="3.2.0-alpha" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.13" />
    <PackageReference Include="MySql.Data" Version="8.0.11" />
  </ItemGroup>

Есть идеи, что может происходить?

1 Ответ

0 голосов
/ 03 мая 2018

В соответствии с сообщением об ошибке кажется, что вы используете ConfigurationManager , чтобы получить строку подключения из local.settings.json. Информация об ошибке не связана с mysql.

Функция Azure v2, работающая во время выполнения 2.x (ядро .net), кажется, что ConfigurationManager не работает для нее.

В вашем случае вы можете вместо этого попытаться прочитать переменные окружения.

string connectionString= Environment.GetEnvironmentVariable("ConnectionStrings:mysqlconnection");

Или вы можете использовать следующий код для этого.

var builder = new ConfigurationBuilder()
                .SetBasePath(context.FunctionAppDirectory)
                .AddJsonFile("local.settings.json");
IConfigurationRoot configuration = builder.Build();
var connectionString = configuration["ConnectionStrings:mysqlconnection"];

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true"
  },
  "ConnectionStrings": {
    "mysqlconnection": "xxxxxxxx"
  }
}

Результат теста:

enter image description here

...