サーバー エンドで MVC4/C# を使用し、Azure Web ロール (単一インスタンス、エミュレーターで、http 入力エンドポイントを使用) でホストされ、クライアントで JS にコンパイルされた TypeScript を使用する単純な SignalR ハブ アプリケーションがあります。多くのクライアントがアップロードできる画像のギャラリーがあり、誰かがアップロードすると、接続されている他のクライアントに、これが発生したことを通知し、通知される方法と同様に更新する機会を与えるメッセージを受信してもらいたいここSOで表示している質問に対する新しい回答について。
サーバーには、ギャラリー内のアイテムのリストを返すメソッドと、次のようにメッセージをクライアントにプッシュする別のメソッドがあります。
public virtual void PushMessage(String message)
{
System.Diagnostics.Debug.WriteLine("PushMessage: " + message);
this.Clients.All.pushMessage(message);
}
public virtual GalleryDataResponse<T> List(String accountID, String armID, Int32 page)
{
GalleryDataResponse<T> response = new GalleryDataResponse<T>();
try
{
IEnumerable<T> items = getAllItems(accountID, armID, page);
if (items != null && items.Count() > 0)
{
response.Result = DataResponse.RESULT_DATA;
response.Message = String.Empty;
response.Items = items;
}
else
{
response.Result = DataResponse.RESULT_EMPTY;
response.Message = @"There are no " + itemName + @"s in your account at the moment: " + this.Context.ConnectionId;
response.Items = null;
}
this.Caller.pushMesage("HELLO, CALLER");
PushMessage("HELLO, ALL CLIENTS");
}
catch (Exception ex)
{
response.Result = DataResponse.RESULT_ERROR;
response.Message = ex.Message;
response.Items = null;
}
return response;
}
(List
関数は、型を渡す派生クラスでオーバーライドされますT
-これは正常に機能します)。
クライアントでは、 DefiniteTypedの SignalR 定義ファイルを使用して、次の TypeScript を作成しました。
var that = this;
this.connection = $.hubConnection();
this.connection.logging = true;
this.connection.id = this.gServerData.CurrentAccountID + "-" + this.gServerData.CurrentArmID;
this.connection.start().done(() => {
that.proxy = that.connection.createProxy(that.gServerData.DataHubName);
that.proxy.on("pushMessage", (message) => {
console.log("PUSHED: " + message);
debugger;
});
that.proxy.invoke("List", that.gServerData.CurrentAccountID, that.gServerData.CurrentArmID, 0).done((response: IGalleryDataResponse) => {
that.handleListResponse(response);
});
});
... 次の JavaScript を提供します。
var that = this;
this.connection = $.hubConnection();
this.connection.logging = true;
this.connection.id = this.gServerData.CurrentAccountID + "-" + this.gServerData.CurrentArmID;
this.connection.start().done(function () {
that.proxy = that.connection.createProxy(that.gServerData.DataHubName);
that.proxy.on("pushMessage", function (message) {
t.Tracer.Trace("PUSHED: " + message);
});
that.proxy.invoke("List", that.gServerData.CurrentAccountID, that.gServerData.CurrentArmID, 0).done(function (response) {
that.handleListResponse(response);
});
});
リスト関数の呼び出しは完全に機能します。期待どおりにハブから応答が返ってきます。また、サーバー プロセスを強制終了してブラウザを起動したままにすると、クライアントが接続を維持しようとしていることを示すエラーがコンソールに表示されます。
this.Caller.pushMesage("HELLO, CALLER"); PushMessage("HELLO, ALL CLIENTS");
この 2 行をサーバー側の List 関数に追加して、コンテンツをクライアントにプッシュするサーバーをテストしました。リスト関数が戻る前にそれらが呼び出されることを期待していますが、これは起こっていません。次のように、ハブを外部から呼び出すことも試みました。
var myHub = GlobalHost.ConnectionManager.GetHubContext<MediaGalleryHub>();
myHub.Clients.pushMessage("Hello from Global.asax");
...しかし、トレースから PushMessage 関数が呼び出されていることがわかりますが、クライアント側では何も得られません。
私は何を間違っていますか?
私がすでに試した参考文献には次のものがあります。
http://msdn.microsoft.com/en-us/magazine/hh965663.aspx
https://github.com/SignalR/SignalR/wiki/Hubs
https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs-%28No-Proxy%29