所以我已经阅读了所有关于此的其他SO问题,但看起来应该正确设置所有内容。我正在运行一个自托管的SignalR控制台应用程序,它有一个空的Hub声明(这是用于从服务器到连接客户端的单向通信)。
编辑:链接到重现问题的项目 - https://dl.dropboxusercontent.com/u/66477739/SignalRTest.zip
演示解决方案有3个项目:
server.send('message');
时一切正常,但在服务器启动消息时它不起作用。 在此控制台窗口中键入并按Enter键会将该文本发送到Web应用程序。这个工作! PublishStatusHub.cs
public class PublishStatusHub : Hub
{
}
JS
$(document).ready(function () {
$.connection.hub.url = "http://localhost:8080/signalr";
var publish = $.connection.publishStatusHub;
publish.client.addMessage = function (message) {
console.log(message);
};
$.connection.hub.start().done(function() { });
});
从单独的程序集中调用代码
var context = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>();
context.Clients.All.addMessage("Starting publish...");
虽然我可以看到执行上面的代码(通过断点),但永远不会调用客户端方法。
我确实启用了SignalR日志记录,并且没有抛出任何异常。此外,它从不记录传入的消息。
有趣的是,我可以通过自托管控制台应用程序中Program.cs中的Main()方法将消息发送到客户端:
Program.cs的
static void Main(string[] args)
{
string url = "http://localhost:8080";
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
while (true)
{
string message = Console.ReadLine();
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>();
hubContext.Clients.All.addMessage(message);
}
}
}
现在,如果我输入控制台窗口并按Enter键,消息将成功发送到客户端,并在控制台输出窗口中记录。
但是,如果我将此代码移动到同一控制台应用程序中的另一个文件,然后从另一个程序集(这是最终目标)调用它,它会再次无声地失败:
MessagePublisher.cs
public class MessagePublisher
{
public void Publish(string message)
{
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>();
hubContext.Clients.All.addMessage(message);
}
}
从单独的程序集中调用代码
var messagePublisher = new MessagePublisher();
messagePublisher.Publish("Test message");
我一直坚持为什么我不能从外部程序集向连接的客户端发布消息。
答案 0 :(得分:2)
在您发布的项目中,您尝试从完全不同的控制台应用程序(SignalRTest.BusinessLogic
)发布消息。此应用程序不承载SignalR服务,因此不了解连接的客户端。所有客户端都连接到另一个应用程序(SinglaRTest.SelfHost
)托管的服务。所以这没办法。如果您将在BusinessLogic
应用程序中启动服务,那么这将照常运行。
答案 1 :(得分:0)
我猜你已经创建了一个构造函数,你可以删除它......