Есть ли способ исключить клиента из вызова Clients.method в SignalR?

Я оцениваю SignalR (который используется с Knockoutjs), чтобы увидеть, можем ли мы использовать его для уведомления клиентов о проблемах параллелизма. В основном пользователь «a» сохраняет запись, а пользователи «b, c, d, e, f, g» получают уведомление. У меня в основном есть пример работы, который уведомляет всех клиентов. Так что я думаю, что я почти там.

Я наткнулся на эту ссылку, и она привела меня к текущему пути, по которому я иду. Я также просматривал документацию на Github.

В основном я хочу исключить одного клиента из вызова Clients.method(). Я не вижу способа пройтись по клиентам и проверить ClientId. Единственное другое, что я вижу для достижения этой цели, — это, возможно, взглянуть на использование групп, чтобы отслеживать это, но это казалось немного громоздким, но у меня тоже были проблемы с этим.

 public class TicketHub : Hub
{
    static int TotalTickets = 10;

    public void GetTicketCount()
    {
        AddToGroup("ticketClients");
        Clients.setTicketCount(TotalTickets);
    }

    public void BuyTicket()
    {
        if (TotalTickets > 0)
            TotalTickets -= 1;

        RemoveFromGroup("ticketClients");

        //  This will call the method ONLY on the calling client
        //  Caller.updateTicketCountWithNotification(TotalTickets);

        // This will call the method on ALL clients in the group
        Clients["ticketClients"].updateTicketCountNotify(TotalTickets);

        AddToGroup("ticketClients");

        Caller.updateTicketCountDontNotify(TotalTickets);
    }
}

person Etch    schedule 10.01.2012    source источник
comment
Можете ли вы четко сформулировать, что вы хотите сделать? Вы хотите показать изменения, сделанные пользователем для конкретного пользователя?   -  person sinanakyazici    schedule 11.01.2012
comment
@sinanakyazici Повторюсь, мне нужно уведомить всех клиентов, кроме вызывающего абонента. Кажется, нет способа перебрать клиентов, чтобы исключить определенного. Можно либо назвать конкретный, либо все.   -  person Etch    schedule 11.01.2012


Ответы (3)


javascript-код:

<script type="text/javascript">
    $(document).ready(function () {
        var test = $.connection.test;
        $("#btnTest").click(function () {
            test.testMethod();
        });
        test.show = function (text, guid) {
            if (guid != test.guid) //notify all clients except the caller
                alert(text);
        };
        $.connection.hub.start(function () { test.start(); });
    });
</script>

Класс :

public class Test : Hub
{
    public void Start()
    {
        Caller.guid = Guid.NewGuid();
    }

    public void TestMethod()
    {
        Clients.show("test", Caller.guid);
    }
}
person sinanakyazici    schedule 11.01.2012
comment
Отлично. Я не думал об управлении этим в javascript. Я также надеялся использовать идентификатор клиента, а не управлять своим собственным идентификатором. Однако это работает. Спасибо! - person Etch; 11.01.2012
comment
Решил мою проблему .. Спасибо Синан - person bhargav; 20.02.2012
comment
просто для записи вы также можете использовать $.connection.hub.id вместо своего собственного guid для чего-то тривиального, подобного этому. - person samandmoore; 13.07.2012
comment
Единственным недостатком этого решения является то, что если это сообщение, отправляемое всем клиентам, довольно велико, то выгрузка его на стороне клиента является пустой тратой полосы пропускания. В моем использовании, мобильной разработке, это может быть значительной потерей! - person Norman H; 07.02.2013

Если вы хотите исключить вызывающего абонента из вызова метода на стороне клиента, вы можете использовать:

Clients.Others.clientSideMethod();
person JBeagle    schedule 11.02.2013
comment
Это предполагает, что пользователь сделал звонок в концентратор. - person JBeagle; 11.02.2013

Также существует Clients.AllExcept(...), который позволяет исключать определенных людей.

person Chriseyre2000    schedule 13.02.2013
comment
Да, я использую это сейчас. Но в версии на момент этого вопроса такого звонка не было. - person Etch; 13.02.2013