0

我在 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'} 开头时,它才能正常工作(=接收组消息)。

问题/疑问

  1. 强制长轮询阻止在 Chrome、Opera 中使用 WebSocket。

  2. 目前尚不清楚为什么显式强制长轮询会有所帮助,因为 IE9 无论如何都会使用长轮询(因为它是唯一有效的方法)。

我确实注意到了这种情况,它表明服务器中的 longpolling 和 WebSockets 之间可能存在关系:

一个。使用 $.connection.hub.start()

湾。打开IE9。

C。测试 - 工作正常

d。打开 Chrome(将使用 WebSockets) - 测试 - 工作正常

e. 测试 IE9 - 不起作用。

4

0 回答 0