Windows服务中使用SignalR客户端遇FileNotFoundException问题排查
FileNotFoundException问题 你遇到的这个问题在Windows服务环境里很典型——毕竟服务的运行上下文和普通桌面/控制台程序差异很大,下面是几个针对性的排查和解决步骤:
修正服务的工作目录
Windows服务默认的工作目录是C:\Windows\System32,而非你的服务exe所在的目录。如果SignalR相关的依赖DLL都放在exe目录下,服务启动时会去System32里找这些文件,自然会触发找不到的异常。解决方法很简单,在服务的OnStart方法开头添加代码,强制切换工作目录到程序集所在路径:protected override void OnStart(string[] args) { // 切换工作目录到服务exe所在的文件夹 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); // 后续初始化SignalR客户端的逻辑放在这里 // ... }确保所有依赖项被正确复制
检查NuGet安装的SignalR相关包(比如Microsoft.AspNet.SignalR.Client、Newtonsoft.Json、Microsoft.AspNet.SignalR.Core等)的Copy Local属性是否设置为True。右键项目中的引用→属性,找到这个选项,确保所有SignalR相关的依赖都开启该设置,这样编译时这些DLL会被复制到输出目录,服务部署时能一并带上。用融合日志定位具体缺失的程序集
泛泛的FileNotFoundException很难精准定位问题,你可以用.NET自带的融合日志查看器(Fusion Log Viewer,运行fuslogvw.exe)捕获详细的加载失败信息:- 以管理员身份打开
fuslogvw.exe - 点击「Settings」,选择「Log bind failures to disk」,确认后重启工具
- 启动你的Windows服务触发异常
- 回到融合日志查看器刷新,就能看到具体哪个程序集加载失败、以及它尝试加载的路径,这样就能精准修复缺失的文件。
- 以管理员身份打开
检查服务部署包的完整性
如果是用安装程序(比如WiX、InstallShield)部署服务,要确保安装包包含了所有必要的DLL文件——有些安装工具默认只会复制exe文件,需要手动把所有依赖的DLL添加到安装项目中。
你提到之前的Stack Overflow解答没解决问题,那个解答大概率是针对代理、证书或网络层面的问题,但你的异常核心是文件加载失败,所以重点放在上述几个步骤上应该能解决问题。
内容的提问来源于stack exchange,提问作者Arash Ghasemi Rad

