SignalR: вызвать метод для возвращаемого значения

Я смог продвинуться довольно далеко, используя SignalR, отправляя сообщения клиенту и от клиентов обратно на сервер... и до сих пор это было благословением.

То, что я хотел бы сделать, и это может быть просто то, что SignalR не может обработать... это вызвать ответ.

Разрешает ли SignalR ответы на вызовы? Если да, могу ли я сделать запрос клиентам и просто использовать первый ответ?

Я видел ссылки на HubResponse и task.result, но я не совсем понимаю, как заставить метод концентратора возвращать значения от клиентов.

Я немного поиграл с ним и либо получил AggregateException, либо недопустимое приведение от Task<Object> к Task<MyType>


person Ronnyek    schedule 10.07.2012    source источник


Ответы (1)


Подключенные клиенты передаются только широковещательно. То есть сервер не может делать запросы к ним напрямую. Таким образом, вам нужно будет сделать что-то вроде метода концентратора, в котором один клиент может запросить, чтобы кто-то другой выполнил запрос, затем концентратор передает этот запрос всем подключенным клиентам, а затем, в зависимости от того, какой клиент ответит первым, вы можете передать обратно исходному клиенту. Вам нужно будет поддерживать свое собственное состояние в концентраторе, чтобы, очевидно, направлять запрос/ответы правильной аудитории. Я также думаю, что как только вы получите свой первый ответ, вы захотите сказать всем другим клиентам, чтобы они не беспокоились/не прекращали попытки ответить на вопрос.

Я не уверен, что могу предписать точную архитектуру для этого без некоторых подробностей. Для начала, должен ли любой клиент иметь возможность ответить на любой запрос, или вы бы разделили клиентов на категории? Если вы можете классифицировать клиентов, вы можете гарантировать, что вы транслируете только те запросы, которые имеют смысл для них, используя группы. Далее, вы в основном пытаетесь определить интерфейс всех вопросов, которые можно задать, или вы хотите, чтобы набор мог расширяться без изменения Хаба с течением времени? Это будет определять, используете ли вы строго типизированные методы концентратора или просто используете какой-то общий AskQuestion(string questionId). В первом случае вы, вероятно, не будете использовать группы, как упоминалось ранее, а вместо этого просто настроите отдельные концентраторы для каждой категории запросов.

person Drew Marsh    schedule 10.07.2012
comment
Ну, это не совсем то, что я имел в виду, но это моя вина, что я не объяснил лучше... Скажем, в вашем примере вы хотите, чтобы концентратор запрашивал клиентов, чтобы определить значение для моего метода, например так... `public int MyMethod() { return Клиенты.ВыполнитьРасчет(); }' Я понимаю сложность в том, чей ответ вы бы приняли за ответ... но в моем случае у меня всегда должен быть один клиент типа x для обработки запросов. - person Ronnyek; 10.07.2012
comment
Ах да, это было не совсем понятно, извините. Я могу пересмотреть свой ответ, чтобы соответствовать. - person Drew Marsh; 10.07.2012
comment
Спасибо, я волновался, как это работает... жаль, но я могу придумать план вокруг этого. Цените вклад. - person Ronnyek; 10.07.2012