【发布时间】:2020-05-14 18:00:57
【问题描述】:
我查看了一些类似的问题,但没有弄清楚这个问题。我的 .NET 核心 Web API 项目中有一个简单的集线器。这是中心:
public class NotificationHub : Hub<INotificationClient>
{
public async Task SendMessage(string user, string msg)
{
await Clients.All.ReceiveMessage(user, msg);
}
public Task SendMessageToCaller(string msg)
{
return Clients.Caller.ReceiveMessage(msg);
}
public Task SendMessageToPartner(string user, string msg)
{
return Clients.Client(user).ReceiveMessageToPartner(msg);
}
}
界面如下:
public interface INotificationClient
{
Task ReceiveMessage(string user, string msg);
Task ReceiveMessage(string msg);
Task ReceiveMessageToPartner( string msg);
}
这是来自控制器的代码:
[Route("[controller]")]
[ApiController]
public class NotificationsController : ControllerBase
{
private IHubContext<NotificationHub> _hub;
public NotificationsController(IHubContext<NotificationHub> hub)
{
_hub = hub;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var msg = new NotificationData { ClientId = "12345", Notification = "Somone just connected" };
await _hub.Clients.All.SendAsync("Notification", msg);
return Ok(new { Message = "Request complete" });
}
}
最后是控制台客户端代码:
Console.WriteLine("Press a key to start listening");
Console.ReadKey();
Console.WriteLine("Client Listening!");
var connection = new HubConnectionBuilder()
.WithUrl("http://localhost:61514/notifications")
.Build();
connection.On<NotificationData>("Notification", (notificationData) =>
Console.WriteLine($"Somebody connected: {notificationData.ClientId}"));
connection.StartAsync().GetAwaiter().GetResult();
Console.WriteLine("Listening. Press a key to quit");
Console.ReadKey();
这是带有映射的网络应用程序的启动:
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<NotificationHub>("/Notifications");
});
}
我不断收到此错误:System.IO.IOException: '服务器在握手开始之前已断开连接。'我一定会在这里遗漏一些东西。
更新:
打开日志并得到这个错误:
dbug:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[8] 正在与“http://localhost:61514/notifications”的服务器建立连接。 调试:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[9] 与服务器建立连接“BdROAEEQnGUeDYAW5EspRA”。 错误:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[7] 使用 Url 启动传输“ServerSentEvents”:http://localhost:61514/notifications。 信息:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[1] 开始运输。传输方式:文本。 dbug:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[3] 开始接收循环。 dbug:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[9] 收到 30 个字节。解析 SSE 帧。 dbug:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[4] 接收循环停止。 dbug:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[100] 启动发送循环。 错误:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[18] 传输“ServerSentEvents”已启动。 dbug:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[102] 发送循环已取消。 dbug:Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[101] 发送循环停止。 未处理的异常。信息:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[3] HttpConnection 已启动。 信息:Microsoft.AspNetCore.SignalR.Client.HubConnection[24] 使用 HubProtocol 'json v1'。 System.IO.IOException:在握手开始之前服务器断开连接。 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.HandshakeAsync(连接状态开始连接状态,CancellationToken 取消令牌) 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore(CancellationToken cancelToken) 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore(CancellationToken cancelToken) 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner(CancellationToken cancelToken) 在 System.Threading.Tasks.ForceAsyncAwaiter.GetResult() 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync(CancellationToken cancelToken) 在 NotificationClient.Program.Main(String[] args)
【问题讨论】:
-
您使用的是 .NET Core 3.1 吗?
-
我使用的是 .NET Core 3.1。但是,解决方案发布在下面。看起来这是映射到端点控制器的问题。一旦我修复了它,它就开始工作了
标签: signalr asp.net-core-signalr signalr-client