【问题标题】:how to call Hub or Client Method in One Signal R app1 from another One Signal R app2如何从另一个 One Signal R app2 调用 One Signal R app1 中的集线器或客户端方法
【发布时间】:2016-01-22 17:31:52
【问题描述】:

嗨,我有两个 signalR 应用程序,我需要从 SignalR2 应用程序调用 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 应用程序SignalR2 应用程序,正如我所说的,每个人都知道两个应用程序将有两个单独的客户端,此处的集线器部分我需要从 SignalR1 应用程序的集线器部分调用 SignalR2 应用程序中存在的 ChatHubIn 集线器,并从那里我需要向 SignalR2 应用程序中的所有客户端发送消息

【问题讨论】:

  • 很难用一种方法来理解这个问题......什么是“ChatHubIn”?此外,最好的方案是自托管 signalR 并连接两个应用程序。
  • 嘿,谢谢回复,“ChatHubIn”是 SignalR2 应用程序中存在的集线器,此代码属于 SignalR1 应用程序集线器,我正在尝试调用“ChatHubIn”。
  • 对不起,如果很明显,但“Signalr1 app”和“Signal2 app”分别指的是实际不同版本的信号器吗?还是只是你给他们起名字?
  • @rdoubleui,版本相同,只是名称不同,这是两个独立的信号 R 应用程序
  • 它们是否自托管在同一台机器上?

标签: javascript asp.net signalr signalr-hub


【解决方案1】:

我无法为您的问题提供确切的答案,因为简短的代码和解释的 sn-p 信息量不足,但我所做的是复制了我没有问题的整个解决方案。

只是为了澄清问题:

看到我有两个单独的应用程序 SignalR1 应用程序,SignalR2 应用程序作为我 告诉并且每个人都知道两个应用程序将有两个单独的客户端, 集线器部件在这里我需要调用 SignalR2 应用程序中存在的 ChatHubIn 集线器 从 SignalR1 应用程序的集线器部分,从那里我需要发送消息 给 SignalR2 应用程序中的所有客户端

上面的内容很难消化,所以我做了两个项目;一个网络表单(SignalR1 本质上是服务器/主机)和一个 MVC(SignalR2 客户端)

这些都不是很困难,我安装了完整的signalR堆栈的webform项目,我希望它是这样的服务器。

在 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

【讨论】:

  • 嘿 thnx,你能把完整的代码详细说明吗,因为我是新的这个信号 R........
  • @saaduu 今天晚些时候我会整理出来。
  • @saaduu 请在上面找到下载链接...如果解决了问题,也请将答案标记为已回答。
  • @Tez Wingfield,很抱歉回复太晚了,我没有尝试你给出的代码,bcz 我已经被分配了其他任务,thnx 有很多帮助,你能把所有需要的包都放进去吗.....我会寻求任何帮助,希望你能帮助..
  • @saaduu 如果您下载 GitHub 项目,它将为您指明正确的方向。这只是基本的,但可以让您深入了解正在发生的事情。
【解决方案2】:

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

请注意,两个集线器必须托管在同一台机器上。如果您想在不同机器或托管环境中处理另一个集线器,则让一个集线器充当另一个集线器的客户端。

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

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

调试通过名称解析集线器时可能发生的命名问题。

我仍然怀疑您是否可以通过进程边界获取hub context。如果这不可能,那么最简洁的方法是让集线器额外充当另一个集线器的hub client,它提供了一种专门的方法来接收通知,然后将其广播给其客户端。

【讨论】:

  • 不完全在同一个过程中。考虑到要求,自助托管似乎很合适。
  • 所以你的意思是自托管(如果是的话)应该足以获得context?
  • 我认为它不是自托管的,Q 中没有太多细节。除非提供更多代码,否则我的 cmets 均无效。
  • @saaduu 只是出于好奇,在测试这个时,您是否同时运行/调试两个应用程序?
  • var hubConnection = new HubConnection("MyWebApi"); IHubProxy applicationHubProxy = hubConnection.CreateHubProxy("MyHub"); hubConnection.Start().Wait(); applicationHubProxy.Invoke("MyMethod", AnyParams);正如@rdoubleui 所说,只是稍微深入研究一下文档。
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2016-08-02
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多