Azure functions 与Blazor服务器和Azure功能共享信号器服务

Azure functions 与Blazor服务器和Azure功能共享信号器服务,azure-functions,blazor-server-side,azure-signalr,Azure Functions,Blazor Server Side,Azure Signalr,我有一个在Azure应用程序服务上运行的web应用程序。这是一个Blazor服务器,由信号服务支持。我还有一些由Azure函数执行的后台处理。功能完成后,我想通过SignalR向web应用程序发送通知 我通过在Azure函数上启用信号器输出绑定实现了这一点。只要我将函数应用程序视为信号集线器(即Blazor服务器创建到函数应用程序的HubConnection),我就能够接收Azure函数发送的消息 然而,在上面的场景中,我必须配置第二个以“无服务器”模式运行的SignalR实例。所以我想知道,是

我有一个在Azure应用程序服务上运行的web应用程序。这是一个Blazor服务器,由信号服务支持。我还有一些由Azure函数执行的后台处理。功能完成后,我想通过SignalR向web应用程序发送通知

我通过在Azure函数上启用信号器输出绑定实现了这一点。只要我将函数应用程序视为信号集线器(即Blazor服务器创建到函数应用程序的
HubConnection
),我就能够接收Azure函数发送的消息

然而,在上面的场景中,我必须配置第二个以“无服务器”模式运行的SignalR实例。所以我想知道,是否有一种替代方法可以用于无服务器设计?我是否可以在Azure功能中使用SignalR客户端(并手动创建一个到第一个SignalR服务的
HubConnection


或者这对于Azure功能来说有点太重了?我是否最好以另一种方式创建推送通知(例如Blazor服务器对服务总线队列做出反应,然后通过信号器发送消息)?

因此我想出了两个可能的答案。在第一个版本中,我将SignalR客户端添加到Azure函数:

[函数(“信号函数”)]
公共静态异步任务RunAsync([ServiceBusTrigger(“导入请求”)]字符串json,FunctionContext)
{
var conn=新的HubConnectionBuilder()
.WithUrl(“https://localhost:5001" )
.Build();
等待连接StartAsync();
等待conn.InvokeAsync(“广播”、“我”、“一些消息”);
}
这将连接到Blazor服务器上的集线器,并调用我的
ImportHub
上的广播消息:

公共类导入b:Hub
{
public const字符串HubUrl=“/import”;
公共异步任务广播(字符串用户名、字符串消息)
{
等待客户端.All.SendAsync(“广播”、用户名、消息);
}
}
但是使用这个方法,我为每个函数调用创建一个信号器连接。可能不是最好的计划。我可以将
conn
转换为
static
对象(就像使用
HttpClient
一样),但我仍然需要调用
StartAsync()
。我不确定
轮毂连接的最佳实践是什么

相反,我选择了答案2——Azure函数对Blazor服务器进行api调用。下面是我的函数:

[函数(“信号函数”)]
公共静态异步任务RunAsync([ServiceBusTrigger(“导入请求”)]字符串json,FunctionContext)
{
var client=RestService.For(“https://localhost:5001" );
等待客户端。广播(“我”,json);
}
对于客户端,我正在使用Refit:

公共接口IImportHubApi
{
[获取(“/api/broadcast”)]
任务广播(字符串用户、字符串消息);
}
在Blazor服务器上,我有以下API控制器:

[路由(“api/广播”)]
[ApiController]
公共类广播控制器:ControllerBase
{
专用只读IHubContext\u中心;
公共广播控制器(IHubContext集线器)
{
_轮毂=轮毂;
}
[HttpGet]
公共异步任务获取(字符串用户、字符串消息)
{
wait_hub.Clients.All.SendAsync(“广播”,用户,消息);
}
}
因此,我认为这允许我的Azure功能进行扩展(如果相关的话),而不用担心在使用one Signal服务(默认模式)时管理连接

然而,这是否是一个好主意(从安全角度来看)是另一个问题。我认为只要推送通知不用于邪恶(即用于刷新显示,而不是启动某些进程),那么就需要确保我的服务器代码只使用通知来提示UI刷新

我们有一个API服务器在应用程序服务上运行。因此,我可以将此API调用移动到那里,并将其置于防火墙(API管理)后面。这样,只能在专有网络内进行广播。我假设我可以锁定
ImportHub
,因此您必须首先进行身份验证

但我感兴趣的是其他人可能会说些什么。欢迎任何意见

这看起来像是一场灾难