У меня есть проект ASP.NET Core MVC с RabbitMQ (посредством EasyNetQ) и SignalR.
Далее у меня есть подписка на сообщение RabbitMQ, которое должно отправлять уведомление клиенту через SignalR.
Но, к сожалению, концентратор всегда разрешает null
.
Интересным наблюдением является то, что когда приложение все еще запускается и в очереди все еще есть неподтвержденные сообщения, служба на самом деле разрешается просто отлично.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
services.RegisterEasyNetQ("host=localhost;virtualHost=/");
}
public void Configure(IApplicationBuilder app)
{
app.UseSignalR(route =>
{
route.MapHub<MyHub>("/mypath");
});
app.Use(async (context, next) =>
{
var bus = context.RequestServices.GetRequiredService<IBus>();
bus.SubscribeAsync<MyMessage>("MySubscription", async message =>
{
var hubContext = context.RequestServices
.GetRequiredService<IHubContext<MyHub>>();
// hubContext is null
await hubContext.Clients.All.SendAsync("MyNotification");
});
await next.Invoke();
});
}
Я подозреваю, что, возможно, я делаю что-то неправильно в отношении регистрации подписки внутри app.Use
, но я не могу найти никаких полезных примеров, так что это было лучшее, что я мог понять.
Я использую предварительную версию ASP.NET Core 3 5, я не знаю, имеет ли это какое-либо отношение к моей проблеме.
Итак, вопрос: как мне получить контекст концентратора внутри обработчика подписки на сообщения?
ОБНОВЛЕНИЕ
Я проверил GetRequiredService docs, и вызов должен фактически выдать InvalidOperationException
, если служба не может быть разрешена, но это не так. Он возвращает null
, что, насколько я могу судить, невозможно (если только контейнер по умолчанию не поддерживает регистрацию экземпляров с нулевым значением).