メインアプリで発生している問題を再現するために、簡単なテストアプリを作成しました。
私は次のハブクラスを持っています:
[HubName("testHub")]
public class TestHub : Hub
{
public TestHub()
{
System.Diagnostics.Debug.WriteLine("TestHub instantiated");
}
public void RunMe()
{
System.Diagnostics.Debug.WriteLine("Client Started");
}
public static void Notify(string msg)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<TestHub>();
hubContext.Clients.All.notify("Hello!");
}
}
私のテストWebページは次のとおりです。
<form action="javascript: void(0)" method="post">
<input type="button" value="Do It!" onclick="hitHub()"/>
</form>
<div id="error"></div>
<script type="text/javascript">
var tHub;
$(document).ready(function () {
tHub = $.connection.testHub;
tHub.notify = function (msg) {
alert(msg);
}
$.connection.hub.start().done(function () {
tHub.server.runMe();
});
});
function hitHub() {
$.ajax({
type: "POST",
url: "@Url.Content("~/Hub/Test")" ,
success: function (data, textStatus, jqXHR) {
},
error: function (data, textStatus, jqXHR) {
$("#error")[0].innerHTML = data.responseText;
alert("Error notifying hub.");
}
});
}
</script>
そして最後に、私のHubController:
public class HubController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public void Test()
{
TestHub.Notify("Got it!");
}
}
Application_Startで、RouteTable.Routes.MapHubs();を呼び出します。
ハブがインスタンス化されます。次に、runMe()の呼び出しがサーバーに渡されます。これはすべて正常に機能します。
失敗するのは、「DoIt!」をクリックしたときです。ボタン。hitHub()が呼び出され、HubController.Test()メソッドが呼び出されます。TestHub.Notify( "Got it!")はエラーなしで実行されますが、クライアントでは何も起こりません。
私は何を取りこぼしたか?
更新1: JcFxからの回答に基づいて、$。connection.hub.start()を呼び出す前にtHub.notifyが設定されるように、上記のjavascriptを変更しました。ただし、問題は残ります。
更新2: フィドラーが見るもの:
更新3: MessageBus.Publish()呼び出しをトレースすると、トピックにサブスクリプションがないため、トピックがスケジュールされないことがわかります。サブスクリプションが作成されるかどうかをどの時点で確認する必要があるのかわかりません...