如何在函数应用程序中为Azure SignalR服务使用不同的连接字符串?

mpbci0fu  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(132)

好了,我们有多个signalR服务,我们要做的是当我们的代码被部署时,我们希望从我们的自定义配置文件中选择连接字符串,而不是函数App设置。
这是协商函数。参见“SignalRConnectionInfo”属性。

[FunctionName("negotiate")]
public IActionResult negotiate(
[HttpTrigger(AuthorizationLevel.Function, "post")]
HttpRequest req,
[SignalRConnectionInfo(HubName = HubName, ConnectionStringSetting = **"Cannot pass dynamic connection string here as it requies a constant"**)]
SignalRConnectionInfo connectionInfo )
{
           
}

字符串
我们试着在Startup.cs中添加它

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        IConfigurationRoot config;
       
        builder.Services.AddSignalR().AddAzureSignalR(config["SignalrConnectionString"]);
 
    }
}


它不这样工作。因为它给出了一个错误
无效的主机服务。Microsoft.Azure.WebJobs.Script.WebHost:以下服务注册与预期的服务不匹配:[无效] ServiceType:Microsoft.Extensions.Hosting.IHostedService,生存期:Singleton,ImplementationType:Microsoft.Azure.SignalR.HeartBeat值不能为null。参数名称:provider
那么,还有其他方法可以在函数中使用它吗?

kmpatx3s

kmpatx3s1#

如果要从自定义配置文件中选取连接字符串,则应首先将配置文件添加为配置源。请参阅https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources
SignalR Function扩展将从一个固定位置(默认为AzureSignalRConnectionString)选择连接,您可以通过ConnectionStringSetting对其进行自定义。
如果您有多个SignalR服务示例,您可能希望使用多个端点支持。目前只有Persistent服务传输类型支持多个SignalR示例,也就是说,函数将与所有SignalR示例建立WebSocket连接,您可以自定义路由逻辑。此行为与在函数启动时选择一个示例不同。请参阅https://github.com/Azure/azure-functions-signalrservice-extension/blob/dev/docs/sharding.md
如果不想连接到所有SignalR示例,可以在一个文件中配置每个连接字符串,并选择一个文件作为函数启动时添加的配置源。

3duebb1j

3duebb1j2#

所以这个问题在这里解决了,https://github.com/Azure/azure-signalr/issues/1329#issuecomment-869375720
我只是把它贴出来回答这个问题
所以基本上,在这个函数中,ConnectionString也可以是来自配置的值,这里“abc”是我们选择的值。

[FunctionName("negotiate")]
public IActionResult negotiate(
 [HttpTrigger(AuthorizationLevel.Function, "post")]
 HttpRequest req,
 [SignalRConnectionInfo(HubName = "sync", ConnectionString="abc")] // here is the config value abc which is being picked up from the config file
SignalRConnectionInfo connectionInfo )
{
   ...       
}

字符串
在连接设置或keyvault中,

{
   "abc":"Endpoint=xxx;AccessKey=xxx;Version=1.0;// here you can put your connectin string
}


这并没有完全回答我的问题,因为我想在启动文件中动态地执行它,但它没有这样做,它仍然从local.settings.json中选择,这是我之前能够做到的。

相关问题