从服务器调用客户端脚本 - SignalR

时间:2012-11-10 14:33:05

标签: signalr

我在mvc4网络应用程序中使用SignalR。 我有一个继承自HUB的课程

[HubName("Chat")]
public class ChatHub : Hub ,IDisconnect  
{
      private void CallMessage(string message)
      {
               Clients.MessagesRecieved(message);
      }
      .... 

在我写的客户端js文件中 $(function(){     globalChatHub = $ .connection.chat;

$.extend(globalChatHub, { MessagesRecieved: function (data) {
    alert(data);
}
});
问题是, 是否可以从我的HomeController.cs中的代码调用客户端脚本“MessagesRecieved function”

让我们这样说:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // this is a test
        ChatHub  h = new ChatHub();
        h.CallMessage("hellow");

    }

3 个答案:

答案 0 :(得分:1)

当然, 您可以像调用客户端代码一样调用它:

//Define the client method:
globalChatHub.hello = function {alert('hello');}
服务器代码中的

只写:

ChatHub  h = new ChatHub();
        h.Client.hello();

方法的名称区分大小写。

此链接中的更多信息SignalR quick start

答案 1 :(得分:1)

您可以使用以下代码获得Hub的{​​{1}}上下文:

ChatHub

然后您可以在var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>(); 上调用您想要的任何方法,也可以直接调用客户端方法。 E.g:

ChatHub

试一试。希望这会有所帮助。

答案 2 :(得分:0)

在mvc控制器中,我使用以下代码来调用hub中的方法

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("ChatHub") as ChatHub;
hub.Echo(HttpContext.Session.SessionID, "Hello Echo");  

在集线器实现中,我更倾向于保持实现以调用Hub中的客户端以使代码具有内聚性。

public void Echo(string sessionId, dynamic data)
{
    var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
    context.Clients.All.ClientSideMethod(..)
}