【问题标题】:Sending messages works fine in Chrome, fails in Firefox and IE发送消息在 Chrome 中工作正常,在 Firefox 和 IE 中失败
【发布时间】:2012-09-25 04:42:17
【问题描述】:

我正在使用 SignalR 向我的客户发送实时更新消息。

接收消息在 Chrome、Firefox 和 IE 中运行良好。这意味着,我可以从我的服务器从我的集线器发送一些东西,并且它可以毫无问题地到达客户端。

public void Receive(string whatever)
{
    // This correctly invokes a function on the clients end.
    Client.sayHello("Test");     
}

发送消息从客户端到服务器在 Firefox 和 IE 中都不起作用,但在 Google Chrome 21 上可以正常工作。

在 Firefox 上,使用 Firebug 的控制台,这些是页面加载后立即触发的事件序列:

GET http://localhost:12962/signalr/signalr/negotiate?_=1348547579430 200 OK 12ms
POST http://localhost:12962/signalr/signalr/send?transport=serverSentEvents&connectionId=b6fdd67f-6a71-4e5f-80cf-9e2b90cc7fe3 200 OK

在 Google Chrome 上,POST 永远不会被调用,这也许就是它在那里工作的原因。我看到的只是negotiate 和connect 的帖子。这是我在学习完教程之后所期待的,以及自从SignalR came out 之后的任何事情!

在 Firefox 上,每次我单击应该向服务器发送消息的按钮时,都会记录在控制台中:

$(document).ready(function() {
     var chat = $.connection.chat;

    /* Actions when someone clicks the Bid button. */
    $(".pujar").click(function () {
        chat.receive($(this).siblings('.auction-id').text());
        $(this).parent().siblings('.seconds').text('15');
    });

    chat.updateAuction = function (message) {
        var result = $.parseJSON(message);

        var divId = "#" + result.AuctionId;
        $(divId + " .seconds").text("15");
        $(divId + " .stat .amount").html("$" + result.LanceCost);
        $(divId + " .stat .latestbidder").html(result.LatestBidder);
        $(divId + " .stat").fadeOut().fadeIn();
    };

    $.connection.hub.start();
});

POST http://localhost:12962/signalr/signalr/send?transport=serverSentEvents&connectionId=b6fdd67f-6a71-4e5f-80cf-9e2b90cc7fe3 200 OK 16ms

Params
connectionId    b6fdd67f-6a71-4e5f-80cf-9e2b90cc7fe3
transport   serverSentEvents

Post
data    {"hub":"chat","method":"Receive","args":["1"],"state":{},"id":1}

Response
{"State":{},"Result":null,"Id":"1","Error":null,"StackTrace":null}

任何想法是什么导致了这个非常奇怪的问题?

【问题讨论】:

  • 点击处理程序的 javascript 代码是什么?

标签: c# asp.net-mvc-3 signalr


【解决方案1】:

您可能在连接开始之前触发“发送”到服务器。

试试这个:

$(document).ready(function() {
     var chat = $.connection.chat;    

    chat.updateAuction = function (message) {
        var result = $.parseJSON(message);

        var divId = "#" + result.AuctionId;
        $(divId + " .seconds").text("15");
        $(divId + " .stat .amount").html("$" + result.LanceCost);
        $(divId + " .stat .latestbidder").html(result.LatestBidder);
        $(divId + " .stat").fadeOut().fadeIn();
    };

    $.connection.hub.start().done(function() {
        /* Wire up click event after the connection has been started */
        $(".pujar").click(function () {
            chat.receive($(this).siblings('.auction-id').text());
            $(this).parent().siblings('.seconds').text('15');
        });
    });
});

请注意,对于您的服务器端代码,您没有在客户端上提供“sayHello”函数,所以我假设您只是没有将它包含在您的 sn-p 中。客户也应该是客户。

【讨论】:

    【解决方案2】:

    我今天遇到了同样的问题。我的问题原来是我在 jquery click 事件上向集线器传递了一个更新(数据库更改),然后将 click 事件设置为恢复它的默认操作(这改变了当前页面)。在一位同事的一些好的建议之后,我将这些事件移到了接收页面上的 document.ready 中,它解决了我看到的问题。如果请求时间过长,Chrome 必须等待这些请求完成,而 Firefox 和 IE 会终止它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多