具有CosmosDb绑定功能的Azure功能正确的本地设置

时间:2019-05-17 15:19:07

标签: c# azure azure-functions azure-cosmosdb

我确定我在这里遗漏了一些简单的东西,但是我无法使它正常工作。我已经在本地安装了Azure存储模拟器,并通过Visual Studio 2019创建了Azure Function 2.0。

我可以在没有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
        )

虽然运行它,但出现以下错误:

  

[5/17/2019 3:09:29 PM]执行'func'(失败,   ID = 8326b1c4-3dd5-461d-b8de-d777c5b925d8)[5/17/2019 3:09:29 PM]   System.Private.CoreLib:执行功能:func时发生异常。   Microsoft.Azure.WebJobs.Host:异常绑定参数“文档”。   Microsoft.Azure.DocumentDB.Core:值不能为null。 [5/17/2019   [下午3:09:29]参数名称:authKeyOrResourceToken。

我尝试了许多其他修补程序,都没有成功。

第一个是利用默认的完整显式连接字符串: Azure docs中的"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存储模拟器在本地执行吗?

1 个答案:

答案 0 :(得分:2)

ConnectionStringSetting绑定中的CosmosDB是Cosmos DB帐户而不是Azure存储的连接字符串的设置。有关每个属性,请参见official docs

步骤1:使用有效的Cosmos DB连接字符串(可以是仿真器)将新设置添加到local.settings.json中。

{
  "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时,请遵循these guidelines,切勿在每次执行的DocumentClient语句内创建using实例。< / p>