在 WPF 核心 Windows 应用程序中使用 SignalR
UseSignalR in a WPF Core Windows Application
尝试使用 .NET Core 3.0 在 WPF Windows 应用程序中设置 SignalR 服务器。我能找到的所有示例都假设有一个 startup.cs 和一个 Configure() 方法,我可以在其中调用 UseSignalR。但我没有。我有一个 "App" class,派生自 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;
});
});
}
但是这个方法永远不会被调用 - 我认为它不应该从应用程序中调用,而是从启动中调用。
最后,我的中心 class:
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 核心的 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 核心
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 class 中添加您的 SignalR 服务和中间件。
尝试使用 .NET Core 3.0 在 WPF Windows 应用程序中设置 SignalR 服务器。我能找到的所有示例都假设有一个 startup.cs 和一个 Configure() 方法,我可以在其中调用 UseSignalR。但我没有。我有一个 "App" class,派生自 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;
});
});
}
但是这个方法永远不会被调用 - 我认为它不应该从应用程序中调用,而是从启动中调用。
最后,我的中心 class:
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 核心的 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 核心
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 class 中添加您的 SignalR 服务和中间件。