SignalR没有调用客户端方法

时间:2016-10-02 15:00:19

标签: c# signalr

所以我已经阅读了所有关于此的其他SO问题,但看起来应该正确设置所有内容。我正在运行一个自托管的SignalR控制台应用程序,它有一个空的Hub声明(这是用于从服务器到连接客户端的单向通信)。

编辑:链接到重现问题的项目 - https://dl.dropboxusercontent.com/u/66477739/SignalRTest.zip

演示解决方案有3个项目:

  • SignalRTest.BusinessLogic - 简单的控制台应用程序,每隔10秒发布一条消息。客户端永远不会收到这些消息。这模拟了我的业务逻辑层,将通知推送到连接的客户端。
  • SignalRTest.SelfHost - 自托管SignalR应用程序+集线器。我添加了一个"发送"集线器的方法,只显示客户端调用server.send('message');时一切正常,但在服务器启动消息时它不起作用。 在此控制台窗口中键入并按Enter键会将该文本发送到Web应用程序。这个工作!
  • SignalRTest.UI - 只是一个空白的MVC应用程序,其中包含一个加载必要脚本的页面。成功接收的消息只会记录控制台输出,此样本将永远不会有任何UI更改。

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");

我一直坚持为什么我不能从外部程序集向连接的客户端发布消息。

2 个答案:

答案 0 :(得分:2)

在您发布的项目中,您尝试从完全不同的控制台应用程序(SignalRTest.BusinessLogic)发布消息。此应用程序不承载SignalR服务,因此不了解连接的客户端。所有客户端都连接到另一个应用程序(SinglaRTest.SelfHost)托管的服务。所以这没办法。如果您将在BusinessLogic应用程序中启动服务,那么这将照常运行。

答案 1 :(得分:0)

我猜你已经创建了一个构造函数,你可以删除它......