Как получить возвращаемые значения из сообщения SignalR?
Я вызываю SignalR изнутри действия MVC Controller
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var ret = context.Clients.Client("Whatever").getValue(userId);
В любом случае я могу получить ответ от метода getValue(), вызываемого на клиенте внутри действия?
Я пробовал несколько способов, но просто не могу получить никакого значения для ret. Я уверен, что это не работает с концентратором SignalR, но не может найти документацию об этом.
Одно из рассмотренных мной решений - после получения getValue, который Клиент вызовет метод в Hub, но тогда мне придется взломать мой путь в получении ответа от концентратора в контроллер.
Ответы
Ответ 1
SignalR не является механизмом RPC, а не механизмом передачи сообщений. Из-за этого нет реальной концепции возвращаемых значений.
Если вы хотите это сделать, вы собираетесь его взломать. Вы могли бы просто сделать что-то, где на сервере вы вызываете getValue(), а затем ответ клиента должен сделать вызов на сервер с возвращаемым значением.
Итак, например, в вашем javascript вы можете иметь что-то вроде:
myHub.client.getValue = function(userId) {
var retVal;
... set your retVal here ...
myHub.returnValue(userId, retVal)
}
И затем сервер реализует метод returnValue()...
Ответ 2
Вызов службы SignalR из JS и наличие возвращаемого значения прост! (Извините, я не читал оригинальный вопрос, вероятно, был очень поздно ночью).
Вы можете сделать это красиво:
<script type="text/javascript">
$(function () {
$.connection.hub.url = "http://localhost:8080/SignalR";
// Declare a proxy to reference the hub.
var myHub = $.connection.myHub;
// Start the connection.
$.connection.hub.start().done(function () {
//Once connected, can call methods with return parameters:
myHub.server
.getValue("userId")
.done(function (result) {
$('#resultText').val(result); //display in textbox the return value of a call to public string GetValue(string userId)
});
});
});
</script>
Работает в SignalR 2.0
Ответ 3
На сервере:
public bool TestBoolRetVal()
{
return true;
}
На использовании клиента С#
bool bres = HubProxy.Invoke <bool> ( "TestBoolRetVal" ) Результат:
Конечно, у вас может быть определенная подпись.