0

我在我的 mvc4 Web 应用程序中使用 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 函数”

让我们这样说:

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

    }
4

3 回答 3

2

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

//Define the client method:
globalChatHub.hello = function {alert('hello');}

在服务器代码中只写:

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

方法的名称区分大小写。

此链接中的更多信息SignalR 快速入门

于 2012-11-10T14:43:40.280 回答
2

您可以使用以下代码Hub为您提供上下文:ChatHub

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

然后你可以调用你想要的任何方法,ChatHub或者你可以直接调用客户端方法。例如:

context.Clients.All.MessagesRecieved("test");

试试看。希望这可以帮助。

于 2013-02-27T15:43:24.673 回答
0

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

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

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

public void Echo(string sessionId, dynamic data)
{
    var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
    context.Clients.All.ClientSideMethod(..)
}
于 2013-05-23T06:19:22.130 回答