使用Azure SignalR Service连接SignalR Hub时遇URI格式错误求助
解决方法
核心错误原因
你混淆了Azure SignalR连接字符串的使用场景:
- Azure SignalR的连接字符串是给服务器端用的,用来让你的.NET Core控制台服务器和Azure SignalR Service建立关联;
- 客户端(WinForms)需要连接的是你的本地服务器的Hub地址,而不是直接用Azure SignalR的连接字符串。
具体修复步骤
修改客户端连接地址
把客户端的HubConnection创建代码改成指向你的本地服务器Hub端点,比如你的控制台服务器运行在http://localhost:5000,那么地址应该是http://localhost:5000/ChatSampleHub:// 替换成你本地服务器的实际地址 var hubUrl = "http://localhost:5000/ChatSampleHub"; hubConnection = new HubConnectionBuilder().WithUrl(hubUrl).Build();修正SignalR客户端API(适配ASP.NET Core SignalR)
你当前代码里的CreateHubProxy是旧版ASP.NET SignalR(Microsoft.AspNet.SignalR.Client)的API,如果你用的是ASP.NET Core SignalR客户端(Microsoft.AspNetCore.SignalR.Client包),需要改用新版API,同时注意WinForms UI更新必须切换到主线程:private async void buttonConnect_Click(object sender, EventArgs e) { var hubUrl = "http://localhost:5000/ChatSampleHub"; hubConnection = new HubConnectionBuilder() .WithUrl(hubUrl) .Build(); // 直接通过hubConnection注册消息处理方法,无需hubProxy hubConnection.On<string>("MessageReceived", message => { // WinForms中跨线程更新UI需要调用Invoke切换到主线程 this.Invoke((Action)(() => AppendMessageToTextBox(message))); }); try { await hubConnection.StartAsync(); // 新版方法为StartAsync,而非Start MessageBox.Show("Connected successfully"); } catch (Exception ex) { MessageBox.Show("Connection failed: " + ex.Message); } }确保客户端NuGet包版本匹配
服务器用的是ASP.NET Core SignalR,客户端必须安装Microsoft.AspNetCore.SignalR.ClientNuGet包,禁止使用旧版的Microsoft.AspNet.SignalR.Client(两者架构不兼容,无法互通)。
额外说明
如果需要客户端直接连接Azure SignalR Service(绕过你的服务器),需要启用Azure SignalR的无服务器模式,并使用专门的客户端连接字符串,同时你的业务逻辑需要调整为通过Azure SignalR的REST API发送消息。但基于你当前的架构(有.NET Core服务器),优先推荐客户端连接本地服务器的方案。
内容的提问来源于stack exchange,提问作者duta

