MVCコントローラーアクション内からSignalRを呼び出しています
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var ret = context.Clients.Client("Whatever").getValue(userId);
とにかく、アクション内のクライアントで呼び出されているgetValue()メソッドから応答を取得できますか?
私はいくつかの方法を試しましたが、単にretの値を取得できません。これはSignalRハブでは機能しないと確信していますが、これに関するドキュメントは見つかりませんでした。
私が検討した1つの解決策は、getValueを受け取った後、クライアントがハブのメソッドを呼び出すことですが、ハブからコントローラーに応答を取得するためにハックする必要があります。
SignalRは、メッセージを渡すメカニズムほどRPCメカニズムではありません。そのため、戻り値の実際の概念はありません。
あなたがそれをしたいなら、あなたはそれをハックするつもりです。サーバーでgetValue()を呼び出して、クライアントの応答が戻り値でサーバーを呼び出すという単純なことを行うことができます。
したがって、たとえば、JavaScriptで次のようにすることができます。
myHub.client.getValue = function(userId) {
var retVal;
... set your retVal here ...
myHub.returnValue(userId, retVal)
}
そして、サーバーにreturnValue()メソッドを実装させます...
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で動作
サーバー上:
public bool TestBoolRetVal()
{
return true;
}
C#クライアントで:
bool bres = HubProxy.Invoke< bool >("TestBoolRetVal").Result;
もちろん、任意の署名を定義できます。