我正在使用 ASP.NET Core 2.1 RC1。 我还使用 Signal-R(在这里找到):
https://learn.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-2.1
我正在创建一个托管 Kestrel 并使用 Signal-R 的 .NET Core 控制台应用程序。我几乎已经将其设置为完全,正如入门文档中关于设置启动的说明。
这一切都很好。我能够连接到它,获取其中包含 signal-R 脚本的 HTML,接收我使用 Clients.All.SendAsync 制作的消息。效果很好。
但是 我希望能够从中心外部向客户发送消息。我的应用程序中发生一些事件,并向客户端发送一条消息。在完整的 .NET 中,我将使用 GlobalHost 并获取上下文。在我在 Stack Overflow 上进行的所有搜索中,它们引用了不再有效的内容,或者在 IHubContext 中传递的 REST API Controller 中使用的内容。
我的program.cs中有一个事件监听器,当事件被触发时,我希望能够向我的UserInterfaceHub发送消息。
那么,如何获取 Program.CS 中的集线器上下文,以便我可以从 Program.CS 中的事件委托(delegate)中向其发送消息(调用 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");});
}
程序.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 中,我有这个事件委托(delegate): //现在我们准备好了,开始聆听。 等待
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?
}
最佳答案
我遇到了类似的情况,解决方法如下:
在您的服务层中,创建一个名为 ISendHubMessage 之类的接口(interface)。有一个名为 Send() 的方法,它接受您想要通过 SignalR 发送的参数。在同一文件中创建一个名为 SendHubMessage 的类来实现该接口(interface)。让它做一个返回。
在您的顶级项目(Startup.cs 文件所在的位置)中创建另一个名为 SendHubMessage 的类,该类从服务层实现相同的 ISendHubMessage 接口(interface)。在此 SendHubMessage 中,您可以使用 DI 来访问集线器,如上所述。此方法将执行通过 SignalR 发送的实际逻辑。
在 StartupConfigureServices() 方法中,添加以下行:
services.AddTransient<"Service".ISendHubMessage, "TopLevel".SendHubMessage>();
(其中“Service”是服务级别项目的命名空间,“TopLevel”是顶级项目的命名空间)。
您对这一行所做的事情是说“每当一个对象从服务层请求 ISendHubMessage 依赖项时,请为其提供在我的顶级项目中定义的 SendHubMessage 类”。
最后,在顶级项目之外的代码中您想要通过集线器发送消息的所有位置,在构造函数中注入(inject) ISendHubMessage 依赖项。然后,您可以在类方法中引用它,并且当您调用 Send() 时,它将调用顶级项目中的 SendHubMessage 类中定义的 Send() 方法。
关于asp.net-core - 获取 ASP Net.Core Signalr (.NET Core 2.1) RC 的集线器上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50645678/