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 存储模拟器在本地执行吗?
将ConnectionStringSetting在CosmosDB绑定的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手动创建,请遵循这些准则,切勿在每次执行时DocumentClient在using语句中创建实例。
| 归档时间: |
|
| 查看次数: |
2206 次 |
| 最近记录: |