UseSignalR в основном приложении Windows WPF - PullRequest
0 голосов
/ 16 мая 2019

Попытка настроить сервер SignalR в приложении WPF Windows с использованием .NET Core 3.0.Все примеры, которые я могу найти, предполагают, что у каждого есть файл startup.cs с методом Configure (), где я могу вызвать UseSignalR.Но я неУ меня есть класс "App", полученный из Application.(Возможно, мне не хватает чего-то фундаментального в WPF / Core / Win, не связанного с SignalR)

Извлечение кода:

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;
            });
        });
    }

Но этот метод никогда не вызывается - я не верю, что он должен из приложения, но из StartUp.

Наконец, мой класс-концентратор:

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

Компилируется нормально, но я не думаю, что концентратор на самом деле работает, поэтому он ничего не делает, конечно.

Есть ли что-то другое, что я должен сделать, чтобы запустить и правильно настроить концентратор в этом типе установки?

FWIW Я использовал SignalR в стандартной .NET Framework (не Core) с приложениями WinFormsбез проблем, так что я смутно знаком с концепциями, просто не знаком с способом Core / WPF / Win.

Большое спасибо.

1 Ответ

0 голосов
/ 17 мая 2019

Действия по созданию приложения WPF, на котором размещено ядро ​​ASP.NET:

Создать решение:

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"/>

Размещение ядра ASP.NET в течение времени жизни приложения WPF

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

dotnet run

Если все работает правильно, вы увидите «Hello world» на http://localhost/

А затем добавьте службы SignalR и промежуточное программное обеспечение в класс Startup в проекте веб-приложения.

...