【发布时间】: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/…
-
谢谢。我仍在努力理解这一点——不要忽视你。