2013-06-26 29 views
12

我是使用SignalR(今天开始)的新手,非常简单地向所有连接的客户端发送消息,但现在我只想发送给一个组。我无法找到有关如何在客户端加入的简单文档。如果有人可以帮助,我怎么才能在JavaScript方面加入一个组。谢谢你的帮助。如何使用SignalR加入组

public class EventHub : Hub 
{ 
    public void SendNewMedia(MediaInfoViewModel model,Guid eventId) 
    { 
     Clients.Group(eventId.ToString()).setupmedia(model); 
    } 
} 
//Controller that is sending client new data 
var eventHub = GlobalHost.ConnectionManager.GetHubContext<EventHub>(); 
       var result = eventHub.Clients.Group(eventId.ToString()).setupmedia(eventViewer); 

//Finally the javascript. Not sure how to setup just for a group 
$(function() { 
    var event = $.connection.eventHub; 
    event.client.setupmedia = function (newMedia) { 

     $('#photolist').prepend('<li><img src="' + newMedia.MediaUrl + '" class="img-polaroid span2"/></li>'); 
    }; 
    $.connection.hub.start(function() { 
     event.server.create(eventID);//I know this is wrong but not sure how to connect 
    }).done(function() { 
     alert('conntected. Ready to retrieve data!'); 
    }); 
}); 

回答

25

你不能。如果你可以从JavaScript加入一个组,那么任何人都可以使用你的代码加入任何破坏安全性的组。如果您真的需要这么做 - 在服务器端创建一个方法,将组名称作为参数并将客户端添加到组中。

public void JoinGroup(string groupName) 
{ 
    this.Groups.Add(this.Context.ConnectionId, groupName); 
} 

之后,从JS调用它的惊讶,这是唯一的答案是

eventHub.server.joinGroup("my-awsm-group"); 
+0

类。作为Signal R的新手,我很好奇自己加入团队的替代模式是什么?有没有方法可以加入服务器端的客户端,例如它们不是像这样的直接显式交互(JS客户端调用方法的地方)的一部分。如果你有他们的客户ID,然后他们神奇地成为它的一部分,你可以加入一个客户端到服务器端的一个组? PS。这真的不是一个不同的问题 - 如果你(或任何其他人)有任何其他想法,更是如此。 –

+1

组管理只在服务器上完成,所以是的 - 如果你有用户的连接ID,你可以将他添加到任何组。事实上,这就是它应该工作的方式。 –