Не удается установить соединение между SignalR с клиентом WPF - PullRequest
0 голосов
/ 15 октября 2019

У меня есть приложение WEB API в ASP.NET Core с SignalR (клиент JavaScript). пожалуйста, посмотрите мою конфигурацию запуска ниже

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {

        ....................................

        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                policy => policy.WithOrigins(Configuration.GetSection("ApplicationPortalURL").Value)
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });

        ............................................


        services.AddSingleton<MyHub>();

        services.AddSignalR();

        ............................................

        services.AddMvc();
        .AddControllersAsServices()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        var builder = new ContainerBuilder();

        builder.Populate(services);
        ApplicationContainer = builder.Build();
        return new AutofacServiceProvider(ApplicationContainer);
    }


    public async void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseCors("CorsPolicy");


        app.UseSignalR(routes =>
        {
            routes.MapHub<MyHub>("/MyHub");
        });


        app.UseMvc();

        var bus = ApplicationContainer.Resolve<IBusControl>();
        await Task.Run(() =>
        {
            var busHandle = TaskUtil.Await(() => bus.StartAsync());
            lifetime.ApplicationStopping.Register(() => busHandle.Stop());
        });
    }

HUB Class

 public class MyHub : Hub
{

    public static HashSet<string> CurrentConnections = new HashSet<string>();

    public async override Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
    }

    public async override Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
    }

    public async Task SendMessage(string message)
    {
        await Clients.All.SendAsync("sendmessage", message);
    }
}

Javascript

const connection = new signalR.HubConnectionBuilder()
    .withUrl("http://localhost:33300/MyHub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    }).build();

connection.on("sendmessage", (message) => {
    debugger;
    altert(message);
});

connection.start().then(function (client) {
    console.log('Signal r connection started.');
    console.log(client);
}).catch(function (err) {
    return console.error(err);
});

Все работаетнормально в части сайта. Но у меня тоже есть клиент WPF.

Клиент WPF

namespace WpfAppSignalRClient
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitializeSignalR();
    }
    private void InitializeSignalR()
    {
        try
        {
            var hubConnection = new HubConnection("http://localhost:33300/");
            var prestoHubProxy = hubConnection.CreateHubProxy("MyHub");
            prestoHubProxy.On<string>("sendmessage", (message) =>
            {
                MessageBox.Show(message);
            });
            hubConnection.Start();
        }
        catch (System.Exception ex)
        {

            throw ex;
        }
    }
}

}

Я хочу отправить сообщение SingalR из веб-API в WPF,Я имею в виду, я ожидаю, что сообщение появится в WPF в то же время, когда сообщение отображается на веб-странице. Теперь сообщения SignalR отображаются только на сайте. это не отображается в приложении WPF. Пожалуйста, совет, если у вас есть идеи.

Спасибо

1 Ответ

0 голосов
/ 16 октября 2019

Я отправил этот ответ в соответствии с комментариями пользователя @ mm8.

Я внес некоторые изменения в мой раздел приложений WPF. Сначала я добавил Microsoft.AspNetCore.SignalR.Client из nuget. Затем измените код подключения SignalR, как показано ниже.

  private async void InitializeSignalR()
    {
        try
        {
            connection = new HubConnectionBuilder()
                        .WithUrl("http://localhost:33300/MyHub")
                        .Build();

            #region snippet_ClosedRestart
            connection.Closed += async (error) =>
            {
                await Task.Delay(new Random().Next(0, 5) * 1000);
                await connection.StartAsync();
            };
            #endregion

            #region snippet_ConnectionOn
           connection.On<string>("sendmessage", (message) =>
           {
               this.Dispatcher.Invoke(() =>
               {
                   lstListBox.Items.Add(message);
               });
           });

            #endregion

            try
            {
                await connection.StartAsync();
                lstListBox.Items.Add("Connection started");
                //connectButton.IsEnabled = false;
                btnSend.IsEnabled = true;
            }
            catch (Exception ex)
            {
                lstListBox.Items.Add(ex.Message);
            }
        }
        catch (System.Exception ex)
        {

            throw ex;
        }
    }

Теперь все работает нормально. Спасибо большое @ мм8

...