web-dev-qa-db-ja.com

SignalRメッセージから戻り値を受け取る方法は?

MVCコントローラーアクション内からSignalRを呼び出しています

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

とにかく、アクション内のクライアントで呼び出されているgetValue()メソッドから応答を取得できますか?

私はいくつかの方法を試しましたが、単にretの値を取得できません。これはSignalRハブでは機能しないと確信していますが、これに関するドキュメントは見つかりませんでした。

私が検討した1つの解決策は、getValueを受け取った後、クライアントがハブのメソッドを呼び出すことですが、ハブからコントローラーに応答を取得するためにハックする必要があります。

18
Felipe Leusin

SignalRは、メッセージを渡すメカニズムほどRPCメカニズムではありません。そのため、戻り値の実際の概念はありません。

あなたがそれをしたいなら、あなたはそれをハックするつもりです。サーバーでgetValue()を呼び出して、クライアントの応答が戻り値でサーバーを呼び出すという単純なことを行うことができます。

したがって、たとえば、JavaScriptで次のようにすることができます。

myHub.client.getValue = function(userId) {
  var retVal;
   ... set your retVal here ...
  myHub.returnValue(userId, retVal)
}

そして、サーバーにreturnValue()メソッドを実装させます...

20
Pete

JSからSignalRサービスを呼び出して戻り値を取得するのは簡単です。 (申し訳ありませんが、元の質問をよく読んでいませんでした。おそらく夜遅くなりました)。あなたはそれをうまく行うことができます:

<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で動作

30
user619417

サーバー上:

    public bool TestBoolRetVal()
    {
        return true;
    }

C#クライアントで:

 bool bres = HubProxy.Invoke< bool >("TestBoolRetVal").Result;

もちろん、任意の署名を定義できます。

4
roland roos