24

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

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

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

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

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

4

4 に答える 4

31

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

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

于 2013-11-02T12:23:12.253 に答える
24

SignalR は RPC メカニズムではなく、メッセージ パッシング メカニズムです。そのため、戻り値の実際の概念はありません。

やりたければハックする。サーバーで getValue() を呼び出すと、クライアントの応答が戻り値でサーバーを呼び出すという単純なことができます。

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

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

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

于 2012-12-13T15:44:16.470 に答える
6

サーバー上:

    public bool TestBoolRetVal()
    {
        return true;
    }

C# クライアントで:

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

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

于 2016-12-26T16:22:47.153 に答える