Функция Azure с привязкой CosmosDb к локальной настройке - PullRequest
0 голосов
/ 17 мая 2019

Я уверен, что мне здесь не хватает чего-то простого, но я не могу заставить это работать.Я установил Azure Storage Simulator локально и создал функцию Azure 2.0 через Visual Studio 2019.

Я могу запустить функцию без привязки CosmosDb следующим образом:

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "EndpointUri": "https://localhost:8081",
    "PrimaryKey": "<KEY_HERE>"
  }
}

Function.cs

public static class Function
{
    [FunctionName("func")]
    public static async Task Run(
        [TimerTrigger("0 * * * * *")] TimerInfo myTimer,
        ILogger log
    )
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        var endpointUri = new Uri(Environment.GetEnvironmentVariable("EndpointUri", EnvironmentVariableTarget.Process));
        var primaryKey = Environment.GetEnvironmentVariable("PrimaryKey");

        using (var client = new DocumentClient(endpointUri, primaryKey))
        {
            var queryOptions = new FeedOptions { MaxItemCount = -1 };
            var documents = client.CreateDocumentQuery<Doc>(UriFactory.CreateDocumentCollectionUri("db_id", "col_id"), queryOptions);

            foreach (var document in documents)
            {
              ...
            }
        }
    }
}

Код выполняется должным образом и получает документы, которые у меня есть в моем эмуляторе локального хранилища.

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

Я обновил сигнатуру метода на Function.cs до:

public static async Task Run(
            [TimerTrigger("0 * * * * *")] TimerInfo myTimer,
            ILogger log,
            [CosmosDB(
                databaseName: "db_id",
                collectionName: "col_id",
                ConnectionStringSetting = "AzureWebJobsStorage",
                SqlQuery = "SELECT * FROM col_id")
            ] IEnumerable<Doc> documents
        )

Когда я запускаюТем не менее, я получаю следующую ошибку:

[17.05.2009 15:09:29] Выполнено 'func' (Failed, Id = 8326b1c4-3dd5-461d-b8de-d777c5b925d8)[17.05.2009 15:09:29] System.Private.CoreLib: Исключительная ситуация при выполнении функции: func.Microsoft.Azure.WebJobs.Host: параметр привязки исключения «документы».Microsoft.Azure.DocumentDB.Core: значение не может быть нулевым.[17.05.2009 15:09:29] Имя параметра: authKeyOrResourceToken.

Я перепробовал ряд других поворотов, но безуспешно.

Первый былиспользовать полную явную строку подключения по умолчанию: "AzureWebJobsStorage": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;",, как указано в документах Azure .

Есть идеи, как изменить вышеприведенное выполнение для локального выполнения в моем эмуляторе хранилища Azure?

1 Ответ

2 голосов
/ 17 мая 2019

ConnectionStringSetting в привязке CosmosDB - это настройка строки соединения для учетной записи Cosmos DB, а не хранилища Azure. См. официальные документы для каждого атрибута.

Шаг 1: Добавьте новую настройку в local.settings.json с допустимой строкой подключения Cosmos DB (это может быть эмулятор).

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "EndpointUri": "https://localhost:8081",
    "PrimaryKey": "<KEY_HERE>",
    "CosmosDBConnectionString": "AccountEndpoint=https://localhost:8081;AccountKey=<KEY_HERE>;",
  }
}

Шаг 2: Измените свой Function.cs, чтобы использовать этот новый параметр:

public static async Task Run(
    [TimerTrigger("0 * * * * *")] TimerInfo myTimer,
    ILogger log,
    [CosmosDB(
        databaseName: "db_id",
        collectionName: "col_id",
        ConnectionStringSetting = "CosmosDBConnectionString",
        SqlQuery = "SELECT * FROM col_id")
    ] IEnumerable<Doc> documents
)

При желании вы всегда можете извлечь экземпляр DocumentClient из привязки, если хотите выполнить запрос вручную или выполнить другие операции:

public static async Task Run(
    [TimerTrigger("0 * * * * *")] TimerInfo myTimer,
    ILogger log,
    [CosmosDB(
        databaseName: "db_id",
        collectionName: "col_id",
        ConnectionStringSetting = "CosmosDBConnectionString")
    ] DocumentClient documentClient
)

В качестве примечания, всякий раз, когда вы создаете DocumentClient вручную, следуйте этим рекомендациям , никогда не создавайте экземпляр DocumentClient в операторе using при каждом выполнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...