【问题标题】:WPF SignalR ServerWPF SignalR 服务器
【发布时间】:2020-02-10 13:58:59
【问题描述】:

我真的被困住了,需要一些帮助。 我有一个 .NET Core 3.1 WPF 应用程序,它解码篮球记分牌数据,现在我需要将此数据发送到 .html 文件。 .html 文件通过 CasparCG 服务器作为模板打开一次,需要以某种方式实时更新数据。

我目前认为最好的方法是在 WPF 应用程序中有一个 SignalR 服务器和一个运行 SignalR 客户端的 html 模板。其中一项要求是我必须能够通过单击按钮来启动和停止 SignalR 服务器。

问题是,我完全不知道从哪里开始,因为似乎关于在 WPF 应用程序上托管 SignalR 服务器的信息很少。

【问题讨论】:

标签: c# wpf .net-core signalr asp.net-core-signalr


【解决方案1】:

您可以在 WPF 应用程序中托管 ASP.NET Core(包括 SignalR)。

在您的.csproj 文件中引用Microsoft.AspNetCore.App NuGet 包作为框架引用:

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <UseWPF>true</UseWPF>
</PropertyGroup>

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
</ItemGroup>

使用Host.CreateDefaultBuilder API 创建一个IHost,并在单击按钮时根据需要启动和停止它:

using System.Windows;
using System.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Builder;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private IHost _host;

        private async void Start_Click(object sender, RoutedEventArgs e)
        {
            _host?.Dispose();
            _host = Host.CreateDefaultBuilder()
                .ConfigureWebHostDefaults(webBuilder => webBuilder
                    .UseUrls("http://localhost:5100")
                    .ConfigureServices(services => services.AddSignalR())
                    .Configure(app =>
                    {
                        app.UseRouting();
                        app.UseEndpoints(endpoints => endpoints.MapHub<StreamHub>("/streamHub"));
                    }))
               .Build();

            await _host.StartAsync();
        }


        private async void Stop_Click(object sender, RoutedEventArgs e)
        {
            if (_host != null)
            {
                await _host.StopAsync();
                _host.Dispose();
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            _host?.Dispose();
            base.OnClosing(e);
        }
    }
}

【讨论】:

  • 非常感谢!虽然我仍在试图弄清楚如何从服务器向客户端发送消息..
  • @Vilius:例如,您可以使用IHubContextdocs.microsoft.com/en-us/aspnet/core/signalr/…。或者集线器的Clients 属性:docs.microsoft.com/en-us/aspnet/core/tutorials/…
  • 我已经阅读了文档,但我觉得自己像个笨蛋。在 MainWindow 类中,如果我想获取 HubContext,我该怎么做?私有 IHubContext _hubContext = ... ?
  • @Vilius - 你知道我们如何实现这个吗?如果您能分享与此相关的主要代码或方法,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多