如何注入对IHubContext for .NET Core HostBuilder的引用?

时间:2019-05-26 18:23:44

标签: azure-functions azure-webjobs asp.net-core-signalr

我有一个自托管的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方法中访问它?

2 个答案:

答案 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) }
});