向.NET 6 Web API添加SignalR,.NET Framework4.8 WinForms连接时Hub找不到
问题分析与解决方案
你的404错误根源在于客户端使用的SignalR版本与服务器端不兼容,同时连接路径配置错误,具体如下:
核心问题
服务器端使用的是ASP.NET Core SignalR(从services.AddSignalR()和endpoints.MapHub<CucinaHub>("/cucinahub")可以判断),但客户端代码用的是旧版ASP.NET SignalR的API(HubConnection构造函数、CreateHubProxy方法),这两个版本完全不兼容:
- 旧版SignalR客户端会自动在连接路径后追加
/signalr/negotiate(对应你日志里的http://localhost:5000/api/signalr/negotiate),而ASP.NET Core SignalR的协商路径是直接绑定到Hub的路径(即/cucinahub/negotiate)。 - 旧版的
CreateHubProxy方法在Core SignalR客户端中已被移除,API逻辑完全不同。
修复步骤
1. 更换客户端NuGet包
卸载旧版的Microsoft.AspNet.SignalR.Client,安装ASP.NET Core SignalR客户端包:
Install-Package Microsoft.AspNetCore.SignalR.Client
2. 修改客户端连接代码
替换原有的连接逻辑,使用Core SignalR的HubConnectionBuilder:
// 直接指向服务器端配置的Hub路径,无需追加/api _signalRConnection = new HubConnectionBuilder() .WithUrl($"{Properties.Settings.Default.URL}/cucinahub") .Build(); // 注册客户端接收方法,Core版无需CreateHubProxy _signalRConnection.On("GetValvole", async () => await GetValvole()); try { // Core版用StartAsync而非Start await _signalRConnection.StartAsync(); } catch (Exception ex) { Log.Error(ex.ToString()); }
3. 验证服务器端中间件顺序
确保服务器端Startup.cs中的中间件顺序正确,UseEndpoints必须在UseRouting之后:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHub<CucinaHub>("/cucinahub"); }); }
为什么这样修复?
- ASP.NET Core SignalR与旧版SignalR协议不互通,必须使用对应版本的客户端库。
- Core SignalR直接通过Hub路径进行协商和连接,不需要旧版的
/signalr前缀和HubProxy代理层。
内容的提问来源于stack exchange,提问作者andreat
相关产品推荐
相关产品推荐

