如何从另一个信号R app2调用一个信号R app1中的集线器或客户端方法

时间:2016-01-18 11:24:38

标签: javascript asp.net signalr signalr-hub

我有两个signalR应用程序,我需要在SignalR2 app的SignalR app1中调用 Hub方法或客户端方法,我正在使用 GlobalHost.ConnectionManager.GetHubContext 用于访问提供SignalR2应用程序的 ChatHubIn

public class ChatHub : Hub
{ 
    public void SendToOtherApp(string name, string message, string Id)
    {         
        var context = GlobalHost.ConnectionManager.GetHubContext("ChatHubIn");
        context.Clients.All.addNewMessageToPage(name,message);    
    }
}

但是我收到错误 ChatHubIn Hub无法解决这是什么?为什么要来?以任何方式解决此问题或任何其他方式从其他应用程序调用Hub方法或客户端。 的编辑:

public class ChatHubIn : Hub
{
    public void SendToSameApp(string name, string message, string Id) //, string c_id
    {
        Clients.All.addNewMessageToPage(name, message);
    }
}

看到我有两个单独的应用程序 SignalR1 app SignalR2 app 正如我所说,每个机构都知道两个应用程序将有两个独立的客户端,这里的集线器部件我需要从SignalR1应用程序的Hub部分调用SignalR2应用程序中的ChatHubIn Hub,并从那里我需要向SignalR2应用程序中的所有客户端发送消息

2 个答案:

答案 0 :(得分:1)

我无法给出你问题的确切答案,因为代码和解释的简短片段不足以提供信息,但我所做的是复制了我没有遇到任何问题的整个解决方案。

只是为了澄清这个问题:

  

看到我有两个独立的应用程序SignalR1 app,SignalR2 app as i   告诉每个人都知道两个应用程序将有两个独立的客户端,   这里的中心部件我需要调用SignalR2 app中的ChatHubIn Hub   从SignalR1应用程序的Hub部分,我需要发送消息   给SignalR2应用程序中的所有客户

很难消化上述内容,所以我所做的就是创建两个项目;一个webform(SignalR1本质上是服务器/主机)和一个MVC(SignalR2是客户端)

enter image description here

这一切都不是非常困难,webform项目我安装了完整的signalR堆栈,我希望它是服务器本身。

在MVC项目中,我安装了SignalR JS客户端和SignalR .Net客户端,从而使我能够连接到主机。

最重要的是安装/启用需要在主机上安装的Cors: 安装 - 打包Microsoft.AspNet.Cors -Version 5.2.3

在启动班中允许cors:

public void Configuration(IAppBuilder app)
{
    app.Map("/signalr", map =>
    {

        map.UseCors(CorsOptions.AllowAll);
        var hubConfiguration = new HubConfiguration
        {
            EnableJSONP = true
        };
        map.RunSignalR(hubConfiguration);
    });
}

MVC项目不仅可以接收消息,我现在还能够在Hub上激发方法

连接主机:

<script src="~/Scripts/jquery-1.6.4.js"></script>
<script src="~/Scripts/jquery.signalR-2.2.0.js"></script>
<script src="http://localhost:45569/signalr/hubs"></script>
<script>
    $(document).ready(function () {
        var chatHub = $.connection.chatHub;
        $.connection.hub.url = "http://localhost:45569/signalr";
        // Declare a function on the chat hub so the server can invoke it          
        // Create a function that the hub can call to broadcast messages.
        chatHub.client.broadcastMessage = function (name, message) {
            // Html encode display name and message. 
            var encodedName = $('<div />').text(name).html();
            var encodedMsg = $('<div />').text(message).html();
            // Add the message to the page. 
            $('#discussion').append('<li><strong>' + encodedName
                + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
        };
        $.connection.hub.start(function () {
            //We can also fire back :-) Happy days
        });
    });
</script>

我们也可以在C#中做到这一点!:

  var hubConnection = new HubConnection("http://localhost:45569/");
  IHubProxy chatHubProxy = hubConnection.CreateHubProxy("chatHub");
  hubConnection.Start().Wait();
  chatHubProxy .Invoke("Send", "name", "message");

现在,如果我在MVC上安装完整的SignalR包,我可以打电话给我的Hub呼叫另一个:

public class OtherChatHub : Hub
{ 
    public void Send(string name, string message)
    {         
      var hubConnection = new HubConnection("http://localhost:45569/");
      IHubProxy chatHubProxy = hubConnection.CreateHubProxy("chatHub");
      hubConnection.Start().Wait();
      chatHubProxy .Invoke("Send", "name", "message");    
    }
}

//编辑

由于所需的代码级别,要获得最小的sln工作对于此Q来说太多了。所以我决定添加到GitHub供您下载和学习而不仅仅是使用确切的代码

SignalRTwoWay-GitHub

答案 1 :(得分:0)

您需要提供更多信息,以帮助解决此问题。

请注意,这两个集线器必须托管在同一台计算机上。如果要在不同的计算机或托管环境中寻址另一个集线器,请让一个集线器充当另一个集线器的客户端。

根据问题编辑进行编辑: 还有一件事引起了我的注意:基于提供的信息,无法解析集线器名称:尝试通过调用来解析集线器

var context = GlobalHost.ConnectionManager.GetHubContext<ChatHubIn>();

调试按名称解析集线器时可能出现的命名问题。

我仍然有疑问,你可以掌握hub context过程边界。如果那是不可能的话,那么最简洁的方法就是让集线器另外作为另一个集线器的hub client,它提供了一种专门的方法来接收通知,然后将其广播给它的客户。