Как добавить ссылку на IHubContext для .NET Core HostBuilder? - PullRequest
1 голос
/ 26 мая 2019

У меня есть собственная функция Microsoft.Azure.WebJobs Azure, которую я размещаю в контейнере Linux Docker. На данный момент функция просто обрабатывает данные из ServiceBus. Это все отлично работает. Однако я хотел бы иметь возможность публиковать результаты обработки данных на определенных веб-клиентах через Azure SignalR. У меня настроен экземпляр Azure SignalR, и я могу подключиться к нему через различные веб-клиенты.

Я застрял в том, как отправлять сообщения в концентратор SignalR из моей функции.

Я добавил службы SignalR и AzureSignalR через HostBuilder (и соответствующая строка подключения находится в файле 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 голосов
/ 13 июля 2019

Зависимость SignalR должна быть введена с помощью действия ConfigureWebJobs на HostBuilder, а не действия ConfigureServices, например:

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) }
});
0 голосов
/ 05 июня 2019

Вы можете использовать привязки службы SignalR (https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-signalr-service) для функций Azure и добавить свой концентратор через атрибут [SignalRConnectionInfo] для входной привязки и [SignalR] для выходной привязки в методе Function.Run, чтобы получить доступ См. https://github.com/Azure/azure-functions-signalrservice-extension.

...