在SignalR集线器中存储特定客户端的连接ID

时间:2015-09-21 15:14:07

标签: c# asp.net signalr signalr-hub signalr.client

下面您可以在Windows服务上看到我的SignalR自托管集线器的简化版本:

public static class SubscriptionHandler
{
    public static int PriceFeedMembersCount = 0;
}

public class PriceHub : Hub
{
    public Task SubscribeToPriceFeed()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<PriceHub>();
        if (SubscriptionHandler.PriceFeedMembersCount == 0)
        {
            context.Clients.All.updatePriceSubscriptionStatus(true);
        }
        SubscriptionHandler.PriceFeedMembersCount++;
        return context.Groups.Add(Context.ConnectionId, "PriceFeed");
    }

    public Task UnsubscribeFromPriceFeed()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<PriceHub>();
        SubscriptionHandler.PriceFeedMembersCount--;
        if (SubscriptionHandler.PriceFeedMembersCount == 0)
        {
            context.Clients.All.updatePriceSubscriptionStatus(false);
        }
        return context.Groups.Remove(Context.ConnectionId, "PriceFeed");
    }

    public void NotifySubscribers(Price price)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<PriceHub>();
        context.Clients.Group("PriceFeed").updatePrice(price);
    }
}

我为该中心提供了两种类型的客户端:其中一种是Web应用程序,另一种是Windows服务。在这里,您可以看到我的Windows服务作为信号器客户端的演示实现:

public partial class WinSer45 : ServiceBase
{
    private HubConnection hubConnection;
    private IHubProxy priceProxy;
    private Timer timer = new Timer();
    private bool hasSubscribers = false;

    public WinSer45()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        timer.Interval = 1000; // saniyede bir
        timer.Elapsed += timer_Elapsed;
        timer.Enabled = true;

        hubConnection = new HubConnection("http://localhost:8080/signalr", useDefaultUrl: false);
        priceProxy = hubConnection.CreateHubProxy("PriceHub");
        hubConnection.Start().Wait();
        priceProxy.On<bool>("UpdatePriceSubscriptionStatus", hasSubscribers =>
        {
            this.hasSubscribers = hasSubscribers;
        });
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {   
        if (hasSubscribers)
        {
            TestPrice testPrice = new TestPrice() { Id = 1, Buy = 1.2345, Sell = 9.8765, Symbol = "EURUSD" };
            priceProxy.Invoke("NotifySubscribers", testPrice).Wait();    
        }
    }   

    protected override void OnStop()
    {
    }
}

如您所见,我使用 hasSubscribers 标志来最小化集线器和客户端之间的消息。并且hasSubscribers标志由 SubscribeToPriceFeed UnsubscribeFromPriceFeed 方法更改。

如果仔细观察,请在SubscribeToPriceFeed中看到以下行:

  

context.Clients.All.updatePriceSubscriptionStatus(真);

我不想将消息发送给所有客户端,而是我的客户端Windows服务。如何在集线器中存储特定客户端的连接ID?如果我能做到这一点,我知道我可以发送消息到特定的connectionId,如下面的行:

  

context.Clients.Client(的ConnectionId).updatePriceSubscriptionStatus(真);

提前致谢,

0 个答案:

没有答案