我是 ASP.NET Core 和 SignalR 的新手,当然,我使用 Visual Studio Professional 2017 进行了大量实验。
我有一个使用 NuGet 包 Miccrosoft.NETCore.App 和 Microsoft.AspNetCore.App 的 .NET Core 2.1 的 MVC 应用程序。我在源代码中添加了集成的 SignalR 支持,如我阅读的所有文档中所指定的,例如
services.AddSignalR();
中 Startup.ConfigureServices
和 app.UseSignalR(hubRouteBuilder => {hubRouteBuilder.MapHub<MessageHub>("/MessageHub");});
方法中Startup.Configure
。我还添加并实现了 Web 应用程序的客户端 JavaScript 并创建了我的 MessageHub 类。
我构建了一个简单的 Windows 应用程序 (IWinForm),基于 .NET Framework 4.7.2,使用与我的 Web 应用程序完美配合的 Web 应用程序示例中的相同实现,集成了相同的 Microsoft.AspNetCore .SignalR.Client 包(V 1.0.3)如 WPF 中一样进入 Windows 客户端,并且在连接到托管集线器连接的 Web 应用程序时一切正常。 使用我的 Windows 客户端,我可以完美地在 Web 应用程序和 Windows 应用程序之间来回发送消息,甚至可以使用两个不同的“消息接收器”,每个消息接收器都在自己的应用程序中实现。 正如我所说,一切都好
现在我的下一步是执行相同的操作,但使用 Windows 服务应用程序作为客户端,因此我创建了一个 Windows 服务应用程序,它构建在与我的 WinForm 客户端相同的框架 (.NET Framework 4.7.2) 上。 然后,我准确地重现了 Windows 应用程序中实现的步骤,例如使用 Windows 应用程序中使用的相同软件包版本、构建连接、connection.On 等,与我在 Windows 应用程序中所做的完全一样,但它没有连接到网络应用程序。 我告诉自己,只要覆盖 OnStart 未完成,Windows 服务的状态就不会“运行”,因此我实现了一个特定的方法
StartService
,从覆盖中调用,如下所示: Task.Run(() => StartService());
并且,为了连接到Web服务器的集线器服务正确启动并运行后,我设置了一个计时器,在10秒后触发运行connection.StartAsync();
不幸的是,与Windows应用程序不同,与Web集线器的连接尚未完成(使用WireShark观看),因此不会交换消息。
我试图找到一种方法来知道Windows服务内是否连接成功,例如C#中集线器连接上的连接状态,但我没有找到如何实现。
我有很多问题,例如我应该升级我的 SignalR 客户端,还是类似的问题,但我的主要问题仍然是:为什么在 Windows 应用程序中成功使用的模式有效,但相同的模式在 Windows 服务中却不起作用?
欢迎任何建议,非常感谢您的帮助。
经过多次尝试,我终于发现当我的Windows服务尝试连接到SignalR服务器时,这个服务是在SSL中启动的。 因此,在没有任何证书的情况下,该服务无法连接并收到 HttpRequestException,从中我发现了我的问题。 当我从 Web 主机应用程序中删除 SSL 后,它就开始正常工作。 我的脑海中仍然有一些问题,例如:为什么我的 Windows 窗体应用程序在 SSL 下连接没有问题,但 Windows 服务却不能。 如果有人能解释我,我将不胜感激。 提前致谢。 皮埃尔
我也遇到了这个问题,我的代码在桌面 Signale 客户端上运行良好,但是当将其作为服务运行时,该服务将无法连接到 SSl 错误