asp.net-core - 获取 ASP Net.Core Signalr (.NET Core 2.1) RC 的集线器上下文

标签 asp.net-core signalr asp.net-core-2.0 asp.net-core-2.1

我正在使用 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/

相关文章:

c# - LINQ表达式无法翻译。以可以翻译的形式重写查询,或切换到客户端评估EF Core 3.1

c# - 如何优雅地捕获定时器事件的异常?

.net - 从 .Net Core 2.0 项目引用 .Net framework 4.5.2

c# - 无法解析设置类的依赖注入(inject)

c# - 从 webapp 下载 zip 文件

c# - Signalr - 可以等待客户端的响应吗?

javascript - 在特定设置中未调用 WebApi Controller 中的 SignalR 方法

sql-server - 使用 SQL Server 扩展 SignalR - 我们多久可以清除一次数据?

c# - 为什么 IHttpContextAccessor.HttpContext 不正确

asp.net-core - 来自 Entity Framework Core 数据层中 appsettings.json 的 ConnectionString