我确定我在这里遗漏了一些简单的东西,但是我无法使它正常工作。我已经在本地安装了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存储模拟器在本地执行吗?
答案 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>