现有WCF服务集成SignalR的最优方案及相关技术问题咨询
问题背景与咨询
系统现状与改造目标
维护一套运行10年的系统,由WCF Web Service Reference和WPF Client组成。客户端每分钟向WS请求带数据库行版本的更新数据,随着用户量增长,计划引入SignalR以减少数据库I/O、实现WPF Client实时更新,核心目标是尽可能复用现有代码,避免全量重写。
拟定的三种实现方案
- 方案1:
client => HUB => WS => HUB => client- 说明:需新增1个HUB项目,客户端需订阅并向HUB发送数据,WS端无改动,代码变更较多
- 方案2:
client => WS => HUB => client- 说明:需新增1个HUB项目,WS需将结果返回给HUB,客户端仅需订阅HUB,代码变更较少
- 方案3:
client => HUB/WS(合并) => client- 说明:首选方案,让现有WS继承自Hub,无需新增项目,可结合方案2的逻辑
方案尝试遇到的问题
- 尝试方案1/2时:新增.NET Framework 4.8(SDK-style)控制台HUB项目,无法完整添加Web Service Reference,报错:
"You have referenced a project that targets a different version of .NET Core or .NET Standard. Reuse of types in referenced assemblys has been deactivated...",同是.NET Framework 4.8却出现该问题,疑惑是否与HUB项目的SDK-style及Sdk.props、Sdk.targets文件有关 - 尝试方案2时:WS无法与HUB通信,运行时出现文件加载失败,涉及
System.Buffers、Microsoft.Extensions.DependencyInjection、Microsoft.Bcl.AsyncInterfaces等程序集 - 尝试方案3时:将HUB集成到WS中,通过继承实现,在WS静态构造函数中配置并启动HUB(用
RunAsync避免阻塞WS线程),但遇到与方案2相同的运行时加载问题
当前已实现的通信与使用的库版本
已实现通信
client => hub通信正常client => ws通信正常
库版本
客户端
Microsoft.AspNetCore.SignalR.Client6.0.0.0Microsoft.AspNetCore.SignalR.Client.Core6.0.0.0Newtonsoft.Json13.0.1
服务端
Microsoft.AspNetCore2.2.0Microsoft.AspNetCore.SignalR1.1.0Microsoft.AspNetCore.Cors2.2.0Newtonsoft.Json13.0.1
补充说明
方案2中WS作为SignalR客户端(引用Microsoft.AspNetCore.SignalR.Client),无需订阅,仅需实现WS=>HUB的单向通信,由HUB将结果分发给所有订阅客户端。
咨询问题
- 实现目标的最优方案是什么?
- 是否可在WCF服务中集成SignalR Hub?
- SignalR Hub能否托管在IIS(开发用IIS Express,生产用本地IIS)?
- 为何WS与HUB之间无法通信?
解答
1. 最优方案选择
优先选择方案3(WCF服务集成SignalR Hub),理由如下:
- 无需新增独立HUB项目,最大限度复用现有WCF服务的代码和业务逻辑,降低项目维护成本
- 结合方案2的逻辑,WCF处理完数据更新后直接通过集成的Hub推送给客户端,流程简洁,避免跨服务通信的额外开销
- 若暂时无法解决集成的运行时问题,可先采用方案2作为过渡:新增独立HUB项目,WCF作为SignalR客户端推送数据,待问题排查解决后再迁移到方案3
2. 能否在WCF服务中集成SignalR Hub?
可以实现,但需注意配置细节:
- 避免在WCF静态构造函数中启动Hub,建议在WCF服务的
Application_Start(ASP.NET托管场景)或服务初始化逻辑中配置SignalR - 确保WCF和SignalR使用一致的.NET Framework 4.8版本,在
Startup.cs中正确配置SignalR路由:app.UseSignalR(routes => { routes.MapHub<YourIntegratedHub>("/yourHubPath"); }); - 使用异步方法处理推送逻辑,避免WCF线程与SignalR线程互相阻塞
3. SignalR Hub能否托管在IIS?
完全支持:
- 开发环境:可通过IIS Express托管,与普通ASP.NET项目托管方式一致
- 生产环境:本地IIS支持托管基于.NET Framework的SignalR Hub,需注意配置:
- 应用程序池选择.NET CLR版本v4.0
- 启用WebSocket协议(若使用WebSocket传输)
- 设置合适的连接超时时间
4. WS与HUB之间无法通信的原因
核心问题是版本不兼容+依赖缺失+项目风格差异:
- 版本不匹配:服务端用的是ASP.NET SignalR 1.1.0(基于.NET Framework),而WCF作为SignalR客户端用的是ASP.NET Core SignalR Client 6.0.0,两者协议不兼容,ASP.NET SignalR与ASP.NET Core SignalR无法跨版本通信
- 依赖缺失:.NET Framework 4.8默认不包含
System.Buffers、Microsoft.Extensions.DependencyInjection等程序集,需通过NuGet安装兼容.NET Framework 4.8的对应包 - SDK风格冲突:HUB项目是SDK-style,而WCF项目可能为传统非SDK-style,类型复用机制存在差异,导致添加Web Service Reference报错,建议将HUB项目改为传统.NET Framework项目,或统一所有项目的SDK风格
内容的提问来源于stack exchange,提问作者Flou
相关产品推荐
相关产品推荐

