Как получить возвращаемые значения из сообщения SignalR? - программирование
Подтвердить что ты не робот

Как получить возвращаемые значения из сообщения SignalR?

Я вызываю SignalR изнутри действия MVC Controller

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var ret = context.Clients.Client("Whatever").getValue(userId);

В любом случае я могу получить ответ от метода getValue(), вызываемого на клиенте внутри действия?

Я пробовал несколько способов, но просто не могу получить никакого значения для ret. Я уверен, что это не работает с концентратором SignalR, но не может найти документацию об этом.

Одно из рассмотренных мной решений - после получения getValue, который Клиент вызовет метод в Hub, но тогда мне придется взломать мой путь в получении ответа от концентратора в контроллер.

4b9b3361

Ответ 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" ) Результат:

Конечно, у вас может быть определенная подпись.