WPF SignalR 服务器

WPF SignalR Server

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

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

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

您可以在 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);
        }
    }
}