【问题标题】:How do I host a SignalR hub in a WPF app?如何在 WPF 应用程序中托管 SignalR 集线器?
【发布时间】:2022-09-28 20:02:47
【问题描述】:

我想在我的 WPF (.NET Core 6) 应用程序中自托管 ASP.Net Core SignalR 集线器。我使用 Autofac 作为我的 DI 容器,使用 Caliburn.Micro 作为我的 MVVM 框架。

让托管的 SignalR 集线器在应用程序启动时启动:

protected override async void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            host = Host.CreateDefaultBuilder()
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder => webBuilder
                    .UseUrls(\"http://localhost:5100\")
                    .ConfigureServices(services => services.AddSignalR())
                    .Configure(app =>
                    {
                        app.UseRouting();
                        app.UseEndpoints(endpoints => endpoints.MapHub<RemoteControlHub>(\"/remote\"));
                    }))
                .Build();
            await host.StartAsync();
        }

如何将 SignalR IHubContext 注入到我的模型类中?我需要在我的 ConfigureContainer(ContainerBuilder builder) 方法中注册什么,以便我的应用程序类可以执行以下操作:

public MyViewModel(
        ILogger logger,
        IHubContext<RemoteControlHub> hub)
    {
       // do something with hub 
    }

我无法切换到 Microsoft DI,所以这是专门针对 Autofac 的。

  • 您的视图模型是否由主机 DI 容器激活?
  • 是的,我的视图模型是由 DI 容器激活的。我使用带有 Autofac 引导程序的 Caliburn Micro 来构建和连接所有依赖项。
  • DI 容器还是另一个 DI 容器?看起来你可能有 2 个。

标签: autofac caliburn.micro asp.net-core-signalr


【解决方案1】:

@Krazykraut:嗨,我正在做你想做的事。我的 Onstartup 方法如下所示。

protected override async void OnStartup(StartupEventArgs e)
    {
        AppHost = Host.CreateDefaultBuilder()
                      .ConfigureServices(ConfigureRequiredServices(e))
                      .ConfigureWebHostDefaults(webBuilder => webBuilder
                      .UseUrls("http://localhost:5059")
                      .ConfigureServices(services => services.AddSignalR())
                      .Configure(app => {
                          app.UseRouting();
                          app.UseEndpoints(endpoint => { endpoint.MapHub<MyHub>("/myhub"); });
                      }))
                      .Build();

        await AppHost!.StartAsync();

        var map = AppHost.Services.GetRequiredService<Map>();
        map.Show();

        base.OnStartup(e);
    }

现在,当我尝试从控制台应用程序访问 signalR 服务器时,我无法做到这一点。知道我缺少什么吗?

客户端代码:

HubConnection connection = new HubConnectionBuilder()
                          .WithUrl("http://localhost:5059/myhub")
                          .Build();

connection.StartAsync();
connection.SendAsync("SendMessege", "A Message from Client");

connection.On<String>("ReceiveMessege", x => Console.Write(x));
Console.ReadLine();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多