我环顾了一些类似的问题,却没有弄清楚这个问题。我的.NET核心Web API项目中有一个简单的Hub。这是集线器:
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();
这是带有映射的Web应用程序的启动:
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的服务器建立连接。dbug:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection [9]与服务器建立连接'BdROAEEQnGUeDYAW5EspRA'。dbug:Microsoft.AspNetCore.Http.Connections.Client.HttpConnection [7]使用网址开始传输“ 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]启动发送循环。dbug: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.StartAsyncCore(CancellationToken cancellingToken) ),位于System.Threading的Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner(CancellationToken cancelleToken)处。
因此,整整一天地反复思考之后,我发现了问题所在,所以我认为我将在此处发布解决方案,以防其他人遇到此问题。
集线器端点指向控制器。因此,当客户端进行链接时,它两次敲击控制器,导致服务器关闭连接。所以我改变了这一行:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<NotificationHub>("/Notify");
});
从击中控制器的“ / Notifications”到上述代码中的“ Notify”,将客户端从Notifications重新指向Notify
var connection = new HubConnectionBuilder()
.WithUrl("http://localhost:61514/Notify")
.ConfigureLogging(logging =>
{
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Debug);
})
.Build();
消息开始流入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句