【问题标题】:UseSignalR in a WPF Core Windows Application在 WPF 核心 Windows 应用程序中使用SignalR
【发布时间】:2019-05-16 05:28:42
【问题描述】:

尝试使用 .NET Core 3.0 在 WPF Windows 应用程序中设置 SignalR 服务器。我能找到的所有示例都假设有一个带有 Configure() 方法的 startup.cs,我可以在其中调用 UseSignalR。但我没有。我有一个“App”类,派生自 Application。 (我可能遗漏了与 SignalR 无关的有关 WPF/Core/Win 的基本知识)

代码摘录:

public partial class App : Application
{
    public IServiceProvider ServiceProvider { get; private set; }

    public IConfiguration Configuration { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        var builder = new ConfigurationBuilder()
         .SetBasePath(Directory.GetCurrentDirectory())
         .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        Configuration = builder.Build();

        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        ServiceProvider = serviceCollection.BuildServiceProvider();

        var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
        mainWindow.Show();
    }

    private void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient(typeof(MainWindow));

        services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        }));

        services.AddSignalR().AddHubOptions<TestHub>(options =>
        {
            options.EnableDetailedErrors = true;
        });
    }

到目前为止一切都很好,因为它至少可以编译和运行,如果还没有做任何有形的事情的话。

我相信我现在需要实际配置集线器:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSignalR((configure) =>
        {
            var desiredTransports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;

            configure.MapHub<TestHub>("/testhub", (options) =>
            {
                options.Transports = desiredTransports;
            });
        });
    }

但是这个方法永远不会被调用——我认为它不应该来自应用程序,而是来自启动。

最后,我的 hub 类:

class TestHub : Hub
{
    public Task SendMessage(string user, string message)
    {
        return Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

编译正常,但我认为集线器实际上并未运行,因此它当然什么也不做。

在这种类型的设置中,为了让集线器启动和正确配置,我应该做些什么不同的事情吗?

FWIW 我在标准 .NET 框架(不是 Core)中使用 SignalR 和 WinForms 应用程序没有问题,所以我对这些概念有点熟悉,只是不熟悉 Core/WPF/Win 方式。

非常感谢。

【问题讨论】:

  • ASP.NET Core SignalR 构建在 ASP.NET Core 之上,因此您需要从桌面应用程序中引用 ASP.NET Core。在GitHub 上发布了一个类似的问题。与其在 WPF 应用程序中托管 SignalR,不如创建一个自托管的 ASP.NET Core 应用程序:stackoverflow.com/questions/30298458/…
  • 谢谢。我仍在努力理解这一点——不要忽视你。

标签: c# wpf .net-core signalr


【解决方案1】:

构建托管 ASP.NET Core 的 WPF 应用程序的步骤:

创建解决方案:

dotnet new sln WpfHostingAspNetCore -o WpfHostingAspNetCore
cd WpfHostingAspNetCore

创建项目:

dotnet new wpf -o src/WpfHostingAspNetCore.WpfApplication
dotnet new web -o src/WpfHostingAspNetCore.WebApplication
dotnet sln add src/*

添加项目引用:

cd src/WpfHostingAspNetCore.WpfApplication
dotnet add reference ../WpfHostingAspNetCore.WebApplication

添加框架引用:

编辑WpfHostingAspNetCore.WpfApplication.csproj 并将以下行插入ItemGroup 元素:

<FrameworkReference Include="Microsoft.AspNetCore.App"/>

在 WPF 应用程序生命周期内托管 ASP.NET Core

App.xaml.cs

public partial class App : Application
{
    private IHost _host;

    protected override void OnStartup(StartupEventArgs e)
    {
        _host = Host.CreateDefaultBuilder(e.Args)
            .ConfigureWebHostDefaults(webHostBuilder => webHostBuilder.UseStartup<WebApplication.Startup>())
            .ConfigureServices(services =>
            {
                services.AddTransient<MainWindow>();
            })
            .Build();

        _host.Start();

        _host.Services.GetRequiredService<MainWindow>().Show();
    }

    protected override void OnExit(ExitEventArgs e) => _host.Dispose();
}

运行并测试托管在 WPF 应用程序上的简单 Web 应用程序

dotnet run

如果它工作正常,你会在http://localhost/看到“Hello world”

然后在 Web 应用程序项目的 Startup 类中添加您的 SignalR 服务和中间件。

【讨论】:

  • 谢谢,但这是我寻求帮助的“然后添加您的 SignalR 服务”位!
  • 按照我的回答去做,你会在Startup类中找到Configure方法,这就是你需要配置中间件的地方。
  • 您的代码已经包含如何添加信号器服务 (ConfigureServices) 和中间件 (Configure),接下来您只需将现有代码迁移到生成的 Startup 类中从这些步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多