Я использую ASP.NET Core 2.1 RC1.Я также использую для этого Signal-R (находится здесь):
https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-2.1
Я создаю консольное приложение .NET Core, которое содержит Kestrel, и использую Signal-R.Я установил точно , поскольку в документации по началу работы указывается настройка запуска.
Все это прекрасно работает.Я могу подключиться к нему, получить свой HTML-код со скриптом signal-R, получить сообщения, созданные с помощью Clients.All.SendAsync.Отлично работает.
НО Я хочу иметь возможность отправлять сообщения клиентам, находящимся за пределами Хаба.Где в моем приложении происходит какое-то событие, и клиентам отправляется сообщение.В полном .NET я бы использовал GlobalHost и получил контекст.В ALL моих поисках по переполнению стека они ссылаются на то, что больше не работает или не используется внутри контроллера REST API, который передается в IHubContext.
В моем файле program.cs есть прослушиватель событий, и когда событие запускается, я бы хотел иметь возможность отправить сообщение на мой UserInterfaceHub.
Итак, как это сделать?Я получаю контекст концентратора в Program.CS - так что я могу отправлять ему сообщения (вызывать метод SwitchUI) из делегата события, который есть у меня в Program.CS?
StartUp.cs
public void ConfigureServices(IServiceCollection services) {
services.Configure<CookiePolicyOptions>(options => {
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc();
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder => {builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials();}));
services.AddSignalR();
var provider = services.BuildServiceProvider();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseCors("CorsPolicy");
app.UseSignalR(routes => {routes.MapHub<UserInterfaceHub>("/uihub");});
app.UseMvc();
//app.Run(async (context) =>{await context.Response.WriteAsync("Active");});
}
Program.CS
CreateWebHostBuilder(args)
.UseKestrel()
.UseUrls("http://0.0.0.0:" + appProperties.HostPort.ToString().Trim())
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.Build()
.Start();
UserInterfaceHub.cs
namespace InterfaceModule.Hubs {
public class UserInterfaceHub : Hub {
public async Task SwitchUI(string message) {
await Clients.All.SendAsync("ReceiveEvent", message);
}
public override async Task OnConnectedAsync() {
//await SwitchUI("HOWDY NEW PERSON!");
await base.OnConnectedAsync();
}
}
}
edit добавление ясности.
В Program.CS у меня есть делегат этого события: // теперь, когда мы готовы, начните слушать.жду
deviceClient.SetInputMessageHandlerAsync(ModuleProperties.InputName, OnReceiveEvent, deviceClient);
Console.WriteLine("INIT: Event Message Input handler created: [{0}]", ModuleProperties.InputName);
что это:
static async Task<MessageResponse> OnReceiveEvent(Message message, object userContext) {
//HOW DO I REACH THE HUB FROM HERE SO I CAN SEND A MESSAGE TO THE LISTENERS?
}