我根据本教程创建了一个 Blazor WebAssembly 解决方案。 索引页(下面的代码,与教程相同(:
- 适用于VS2019开发环境。
- 在我部署到的另一台 PC 上(机器 2、Win10 专业版(,该页面也可以在 localhost:5000 上正常工作(如果我使用命令dotnet AppName.dll在 IIS 旁边启动它(
- 但是,在该电脑(机器 2(上,托管 SignalR 的 IIS 上未连接(连接到公共 URL 时加载页面,但用于发送SignalR 消息的按钮被禁用,因为 IsConnected 为 false,并且它确实已断开连接(。
- 具有相同代码的控制台应用(请参阅底部的代码(从计算机 1 连接到公共 URL(在计算机 2 上(没有问题,证明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;
}
下面是一个控制台应用最低限度,可以毫无问题地连接到公共 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();
WebSockets 在 IISExpress 上默认启用(用于本地测试(,但在全脂 IIS 上默认禁用。
因此,在使用 WebSockets(如 SignalR(或服务器端 Blazor((部署应用程序时,需要在 IIS 上启用 WebSockets。
有关启用 IIS WebSockets 的说明,请参阅 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1#iisiis-express-support