2013-01-21 37 views
2

我在Signalr中实现了PersistentConnection类。对于我们的网站,我需要能够广播一条消息,然后让每个连接确定该特定消息是否与该特定用户相关,然后再将其发送到管道到浏览器。信号发生器 - 覆盖发送消息的方法

事情是这样的:

public class MyConnection : PersistentConnection { 

    private int _UserID; 

    public override void OnSending(object message) { 
     var msg = message as MyNotification; 
     if(msg != null && !msg.CanRead(_UserID)) 
      return; 
     base.OnSending(message); 
    } 

} 

这可能吗?

现在,我们有一个自定义的会话状态对象。连接后,该id被添加到用户会话对象。当我们发送一条消息时,我们引发一个事件,每个会话都会决定是否将消息传递给其关联的客户端ID。我真的想从会话对象中解耦。

回答

6

您可以创建一个集线器管道模块来获得这种影响。

例如,你可以这样做:

public class MyModule : HubPipelineModule 
{ 
    protected override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context) 
    { 
     return context.Connection.ShouldSend(); 
    } 
} 

然后在您的Application_Start:

GlobalHost.HubPipeline.AddModule(new MyModule()); 

当然,你需要的ShouldSend方法添加到IConnection接口和相应的连接对象,但此会给你你想要的结果。

有关中枢管道模块的更多信息请参阅http://weblogs.asp.net/davidfowler/archive/2012/11/11/microsoft-asp-net-signalr.aspx

+0

这看起来很有希望的枢纽管道部分。让我检查一下。谢谢! –

+0

确实是新版本中最强大的功能。正在寻找这个,谢谢。 – cubski

+0

我能够将所有这些连接起来,但上下文对象没有任何客户端的对象引用。有没有办法使用connectionId检索Hub实例? –