我有两个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应用程序中的所有客户端发送消息
答案 0 :(得分:1)
我无法给出你问题的确切答案,因为代码和解释的简短片段不足以提供信息,但我所做的是复制了我没有遇到任何问题的整个解决方案。
只是为了澄清这个问题:
看到我有两个独立的应用程序SignalR1 app,SignalR2 app as i 告诉每个人都知道两个应用程序将有两个独立的客户端, 这里的中心部件我需要调用SignalR2 app中的ChatHubIn Hub 从SignalR1应用程序的Hub部分,我需要发送消息 给SignalR2应用程序中的所有客户
很难消化上述内容,所以我所做的就是创建两个项目;一个webform(SignalR1本质上是服务器/主机)和一个MVC(SignalR2是客户端)
这一切都不是非常困难,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>: ' + 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供您下载和学习而不仅仅是使用确切的代码
答案 1 :(得分:0)
您需要提供更多信息,以帮助解决此问题。
请注意,这两个集线器必须托管在同一台计算机上。如果要在不同的计算机或托管环境中寻址另一个集线器,请让一个集线器充当另一个集线器的客户端。
根据问题编辑进行编辑: 还有一件事引起了我的注意:基于提供的信息,无法解析集线器名称:尝试通过调用来解析集线器
var context = GlobalHost.ConnectionManager.GetHubContext<ChatHubIn>();
调试按名称解析集线器时可能出现的命名问题。
我仍然有疑问,你可以掌握hub context
过程边界。如果那是不可能的话,那么最简洁的方法就是让集线器另外作为另一个集线器的hub client,它提供了一种专门的方法来接收通知,然后将其广播给它的客户。