Клиент не может подключиться к концентратору SignalR приложения Blazor WebAssembly, работающего в среде размещения IIS - PullRequest
0 голосов
/ 10 февраля 2020

Я создал Blazor WebAssembly Solution в соответствии с Это руководство . Страница указателя (код ниже, без изменений в руководстве):

  1. Работает в среде разработки VS2019.
  2. На другом компьютере P C, который я развертываю на (machine2, Win10 pro), страница также корректно работает на локальном хосте: 5000 (если я запускаю ее вне IIS с помощью команды do tnet AppName.dll )
  3. Однако на этом P C (machine2), на IIS, на котором SignalR не подключается (страница загружается при подключении к URL-адрес публикации c, но кнопка для отправки сообщения SignalR отключена, поскольку IsConnected имеет значение false и ДЕЙСТВИТЕЛЬНО ОТКЛЮЧЕН).
  4. A ConsoleApp с идентичным кодом (см. код внизу), не имеет проблем с подключением от machine1 к общедоступному c URL (на machine2), подтверждая, что сам концентратор SignalR работает правильно .

Что вызывает это? Как я могу отладить клиентскую часть?

@page "/"
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager NavigationManager

<div class="form-group">
    <label>
        User:
        <input @bind="_userInput" />
    </label>
</div>
<div class="form-group">
    <label>
        Message:
        <input @bind="_messageInput" size="50" />
    </label>
</div>
<button @onclick="Send" disabled="@(!IsConnected)">Send</button>

<hr>

<ul id="messagesList">
    @foreach (var message in _messages)
    {
    <li>@message</li>
    }
</ul>

@code {
    private HubConnection _hubConnection;
    private List<string> _messages = new List<string>();
    private string _userInput;
    private string _messageInput;

    protected override async Task OnInitializedAsync()
    {
        _hubConnection = new HubConnectionBuilder()
            .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
            .Build();

        _hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
        {
            var encodedMsg = $"{user}: {message}";
            _messages.Add(encodedMsg);
            StateHasChanged();
        });

        await _hubConnection.StartAsync();
    }

    Task Send() =>
        _hubConnection.SendAsync("SendMessage", _userInput, _messageInput);

    public bool IsConnected =>
        _hubConnection.State == HubConnectionState.Connected;
}

Ниже приведено минимальное количество консольных приложений, которое без проблем подключается к концентратору publi c signalR.

using System;
using Microsoft.AspNetCore.SignalR.Client;
namespace ConsoleSignalRDebug
{
    class Program
    {
        static private HubConnection _hubConnection;
        static void Main(string[] args)
        {
            try
            {
                _hubConnection = new HubConnectionBuilder()
                    .WithUrl("https://myblazorSite.com:443/chatHub")
                    .Build();
                _hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
                { Console.WriteLine("/////////////RECEIVED///////////////" + user + " " + message);});
                _hubConnection.StartAsync().GetAwaiter().GetResult();

                string x = Console.ReadLine();
                _hubConnection.SendAsync("SendMessage", x, x);
                Console.ReadLine();
            }
            catch (Exception e)
            {
                throw;
            }
        }
    }
}

Я пробовал это для отладки, но он работает только на консоли (это работает в любом случае):

_hubConnection = new HubConnectionBuilder()
                    .WithUrl("https://myblazorSite.com:443/chatHub")
                    .ConfigureLogging(logging =>
                    {
                    logging.SetMinimumLevel(LogLevel.Debug);
                    logging.AddConsole();
                        })
                    .Build();

1 Ответ

1 голос
/ 10 февраля 2020

WebSockets по умолчанию включен в IIS Express (используется для локального тестирования), но по умолчанию отключен в полнофункциональном IIS.

Таким образом, при развертывании приложения с использованием WebSockets, например SignalR (или Blazor на стороне сервера), необходимо включить WebSockets в IIS.

Инструкции по включению IIS WebSockets находятся по адресу https://docs.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1#iisiisexpress -поддержка

...