好吧,我们有多个 signalR 服务,我们想要做的是,当部署我们的代码时,我们希望从自定义配置文件而不是函数应用程序设置中选取连接字符串。
这就是协商功能。请参阅“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 值不能为空。 参数名称:provider
那么,在函数中还有其他使用方法吗?
如果您想从自定义配置文件中选择连接字符串,您应该首先将配置文件添加为配置源。 看 https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources
SignalR 函数扩展会默认从固定位置选择连接
AzureSignalRConnectionString
,您可以通过 ConnectionStringSetting
进行自定义。
如果您有多个 SignalR 服务实例,您可能需要使用多端点支持。目前只有
Persistent
服务传输类型支持多个SignalR实例,即函数将与所有SignalR实例建立WebSocket连接,并且您可以自定义路由逻辑。这一行为与在函数启动时选择一个实例不同。请参阅 https://github.com/Azure/azure-functions-signalrservice-extension/blob/dev/docs/sharding.md .
如果您不想连接到所有 SignalR 实例,您可以在一个文件中配置每个连接字符串,并选择一个文件作为在函数启动时添加的配置源。
所以这个问题在这里解决了, 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 )
{
...
}
并在连接设置或密钥库中
{
"abc":"Endpoint=xxx;AccessKey=xxx;Version=1.0;// here you can put your connectin string
}
这并不能完全回答我的问题,因为我想在启动文件中动态地执行此操作,但它没有这样做,它仍然从我之前也可以执行的 local.settings.json 中进行选择。但对于大多数情况来说应该足够了