带有 CosmosDb 绑定的 Azure 函数正确的本地设置

pei*_*ent 1 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>"
  }
}
Run Code Online (Sandbox Code Playgroud)

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)
            {
              ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码按预期运行并获取我在本地存储模拟器中的文档。

我想将其切换为使用 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
        )
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,出现以下错误:

[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:值不能为空。[5/17/2019 3:09:29 PM] 参数名称: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 存储模拟器在本地执行吗?

Mat*_*nta 6

ConnectionStringSettingCosmosDB绑定的conenction字符串的宇宙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>;",
  }
}
Run Code Online (Sandbox Code Playgroud)

第 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
)
Run Code Online (Sandbox Code Playgroud)

或者,DocumentClient如果您想手动运行查询或执行其他操作,您始终可以从绑定中拉入实例:

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

附带说明一下,无论何时DocumentClient手动创建,请遵循这些准则,切勿在每次执行时DocumentClientusing语句中创建实例。