我有一个自托管的Microsoft.Azure.WebJobs Azure函数,该函数托管在Linux Docker容器中。目前,该功能只是在处理来自ServiceBus的数据。这一切都很好。但是,我希望能够通过Azure SignalR将数据处理的结果发布到某些Web客户端。我已经设置了Azure SignalR实例,并且可以从我的各种Web客户端连接到它。
我遇到的是如何从我的功能向SignalR集线器发送消息。
我已经通过HostBuilder添加了SignalR和AzureSignalR服务(并且相应的连接字符串位于appsettings.json文件中):
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace InSysWebJobHubDataProcessor
{
class Program
{
static void Main(string[] args)
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddServiceBus();
});
builder.ConfigureServices(b =>
{
**b.AddSignalR().AddAzureSignalR();**
});
var host = builder.Build();
using (host)
{
host.Run();
}
}
}
}
我相信我必须以某种方式注入对IHubContext的引用,但不知道如何执行此操作。
如何添加对IHubContext的引用,然后在需要时从Function.Run方法中访问它?
答案 0 :(得分:0)
您可以利用SignalR Service绑定(https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-signalr-service)来实现Azure功能,并通过[SignalRConnectionInfo]
属性来为您的集线器添加集线器,而在Function中可以通过[SignalR]
来实现输出绑定。获取访问权限的方法。参见https://github.com/Azure/azure-functions-signalrservice-extension。
答案 1 :(得分:0)
需要使用HostBuilder上的ConfigureWebJobs操作而不是ConfigureServices操作来注入SignalR依赖项,如下所示:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
namespace InSysWebJobHubDataProcessor
{
class Program
{
static void Main(string[] args)
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddServiceBus().AddSignalR();
});
var host = builder.Build();
using (host)
{
host.Run();
}
}
}
}
就我而言,我是从服务总线中提取消息,并将其发送到各个SignalR组。因此,我的功能签名是:
[FunctionName("ProcessQueueData")]
public async Task RunAsync([ServiceBusTrigger("queuename", Connection = "ServiceBusConnection")]Message message, [SignalR(HubName = "myhub")] IAsyncCollector<SignalRMessage> signalRMessages, ILogger log)
然后我通过以下方式将消息发送到SignalR服务:
await signalRMessages.AddAsync(new SignalRMessage
{
GroupName = "groupName",
Target = "clientFunctionName",
Arguments = new[] { JsonConvert.SerializeObject(result.Payload) }
});