IE9 で単純な SignalR MVC 4 アプリをテストしました。アプリはグループ通知を使用します。
public class Booking
{
public void BookFlight(String from, String to, string ConnectionId)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>();
hubContext.Clients.All.addMessage("Started ... " + DateTime.Now.ToString());
string groupName = "Z"; // "g" + ConnectionId;
HttpContext.Current.Session["StartTime"] = DateTime.Now;
// Book first leg
hubContext.Clients.Group(groupName).addMessage(String.Format("Booking flight: {0}-{1} ...", from, to));
Thread.Sleep(2000);
// Book return
hubContext.Clients.Group(groupName).addMessage(String.Format("Booking flight: {0}-{1} ...", to, from));
Thread.Sleep(3000);
// Book car rent
hubContext.Clients.Group(groupName).addMessage(String.Format("Booking car rent: {0}-{1} ...", to, from));
Thread.Sleep(2000);
// Some return value
hubContext.Clients.All.addMessage("Finished ... " + DateTime.Now.ToString());
//hubContext.Clients.Group(groupName).addMessage("Flight booked successfully. Total Time = " + (DateTime.Now - (DateTime)HttpContext.Current.Session["StartTime"]).ToString());
}
}
namespace SignalrProgressDemo.Common
{
public class ProgressHub : Hub
{
public override Task OnConnected()
{
string groupName = "Z";
return Groups.Add(Context.ConnectionId, groupName);
}
...
クライアントコードは次のとおりです。
$(function () {
$("#bookButton").click(function () {
$.ajax("/Home/BookFlight?from=tlv&to=fco&connectionId=" + $.connection.hub.id);
});
var progressHub = $.connection.progressHub;
$.connection.hub.logging = true;
progressHub.client.addMessage = function (message) {
$("#msg").html(message);
};
$.connection.hub.start(); //IE9 does NOT work
//$.connection.hub.start({ transport: 'longPolling' }); //IE9 works OK
});
クライアント コードで示されているように、IE9 は All に送信されたメッセージのみを表示し、グループ "Z" に送信されたメッセージは表示しません。
connection.hub が {transport: 'longPolling'} で始まる場合にのみ、正常に動作します (= グループ メッセージを受信します)。
問題/質問
ロングポーリングを強制すると、Chrome、Opera で WebSocket を使用できなくなります。
とにかくIE9はロングポーリングを使用するため、明示的にロングポーリングを強制することが役立つ理由は不明です(実際に機能する唯一の方法であるため)。
サーバー内の longpolling と WebSockets の間に関係がある可能性があることを示す次のシナリオに気付きました。
を。$.connection.hub.start() を使用する
b. IE9 を開きます。
c. テスト - 正常に動作します
d. Chrome を開きます (WebSocket を使用します) - テスト - 正常に動作します
e. テスト IE9 - 動作しません。