持久函数异常:"Unable to find an Azure Storage connection string to use for this binding."

Durable Function exception: "Unable to find an Azure Storage connection string to use for this binding."

我有一个具有持久函数(以及一些非持久函数)的 Function App,我收到一个 InvalidOperationException,上面写着:Unable to find an Azure Storage connection string to use for this binding.

这是堆栈跟踪:

System.InvalidOperationException:
  at Microsoft.Azure.WebJobs.Extensions.DurableTask.DurableTaskExtension.GetOrchestrationServiceSettings (Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null)
  at Microsoft.Azure.WebJobs.Extensions.DurableTask.DurableTaskExtension.Microsoft.Azure.WebJobs.Host.Config.IExtensionConfigProvider.Initialize (Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null)
  at Microsoft.Azure.WebJobs.Host.Executors.JobHostConfigurationExtensions.InvokeExtensionConfigProviders (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at Microsoft.Azure.WebJobs.Host.Executors.JobHostConfigurationExtensions.CreateStaticServices (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at Microsoft.Azure.WebJobs.JobHost.InitializeServices (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at Microsoft.Azure.WebJobs.Script.Utility.CreateMetadataProvider (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Utility.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 362)
  at Microsoft.Azure.WebJobs.Script.ScriptHost.LoadBindingExtensions (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Host\ScriptHost.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 966)
  at Microsoft.Azure.WebJobs.Script.ScriptHost.Initialize (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Host\ScriptHost.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 299)
  at Microsoft.Azure.WebJobs.Script.ScriptHostManager.RunAndBlock (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Host\ScriptHostManager.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 177)

似乎是持久函数在抱怨缺少连接字符串。但是,我的 AzureWebJobsDashboard 应用程序设置中确实填充了连接字符串,所以我不确定它失败的原因。

(这个问题显示没有答案,所以我采纳了Ling的建议,在这里做了一个正确的答案)

除了 AzureWebJobsDashboard 应用程序设置之外,您还需要在 AzureWebJobsStorage 应用程序设置中指定您的 Azure 存储连接字符串。后一种应用程序设置是各种 Azure Functions 功能所必需的,包括 Durable Functions。两个应用程序设置具有相同的连接字符串是可以的。

此错误是由不正确的 url 引起的。 如果模拟器停止,您会返回: “无法建立连接,因为目标机器主动拒绝” 参考:Create your first durable function in C#

决议:

1 - 确保 Azure 存储模拟器正在运行或重新启动它

C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe stop
Windows Azure Storage Emulator 5.10.0.0 command line tool
The storage emulator was successfully stopped.

C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe start
Windows Azure Storage Emulator 5.10.0.0 command line tool
The storage emulator was successfully started.

2:确保url是正确的。输出包含几个 urls,确保你拿一个用于statusQueryGetUri(这是最多的可能的原因):

{"id":"57756e5133f047ed9213b3956c0268be",
"statusQueryGetUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/57756e5133f047ed9213b3956c0268be?taskHub=TestHubName&connection=Storage&code=Ruk2CuiKU7yk9GM1qjalxynMwk2Bx2/KOpz78lxmPa4cNb2AtDZppw==",
"sendEventPostUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/57756e5133f047ed9213b3956c0268be/raiseEvent/{eventName}?taskHub=TestHubName&connection=Storage&code=Ruk2CuiKU7yk9GM1qjalxynMwk2Bx2/KOpz78lxmPa4cNb2AtDZppw==",
"terminatePostUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/57756e5133f047ed9213b3956c0268be/terminate?reason={text}&taskHub=TestHubName&connection=Storage&code=Ruk2CuiKU7yk9GM1qjalxynMwk2Bx2/KOpz78lxmPa4cNb2AtDZppw==",
"purgeHistoryDeleteUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/57756e5133f047ed9213b3956c0268be?taskHub=TestHubName&connection=Storage&code=Ruk2CuiKU7yk9GM1qjalxynMwk2Bx2/KOpz78lxmPa4cNb2AtDZppw=="}

工作配置文件:

{
    "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  }
}

正如其他答案所说,由于缺少 AzureWebJobsStorage 连接字符串,我遇到了异常。但是,连接字符串存在于 appsettings.Development.json 文件中...

为了让 Durable Function 项目在本地启动,连接字符串需要在 local.settings.json 文件中。