【发布时间】:2018-06-01 14:27:25
【问题描述】:
我正在使用 ASP.NET Core 2.1 RC1。 我也在使用 Signal-R(在此处找到):
https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-2.1
我正在创建一个托管 Kestrel 并使用 Signal-R 的 .NET Core 控制台应用程序。我已经完全按照入门文档中的说明设置了 Startup。
这一切都很好。我能够连接到它,获取包含 signal-R 脚本的 HTML,接收我使用 Clients.All.SendAsync 制作的消息。效果很好。
但是 我希望能够从集线器外部向客户发送消息。我的应用程序中发生了一些事件,并向客户发送了一条消息。在完整的 .NET 中,我将使用 GlobalHost 并获取上下文。在 ALL 我对 Stack Overflow 的搜索中,它们引用了不再起作用的东西,或者在 IHubContext 中传递的 REST API 控制器中使用的东西。
我的 program.cs 中有一个事件监听器,当事件被触发时,我希望能够向我的 UserInterfaceHub 发送消息。
那么——我如何在 Program.CS 中获取集线器上下文——以便我可以从 Program.CS 中的事件委托中向它发送消息(调用 SwitchUI 方法)?
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();
}
}
}
编辑增加清晰度。
在 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?
}
【问题讨论】:
标签: asp.net-core signalr asp.net-core-2.0 asp.net-core-2.1