2

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 が呼び出されることはありません。おそらくそれがそこで動作する理由です。私が見るのはnegotiateandの POST だけですconnectこれは、チュートリアルに従って、 SignalR が登場して以来、私が期待するようになったものです!

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}

この非常に奇妙な問題の原因は何ですか?

4

2 に答える 2

1

I had the same issue today. My issue turned out to be I was passing the hub an update (database change) on a jquery click event, then setting the click event to resume it's default action (which changed the current page). After some good advice from a co-worker, I moved those events to document.ready on the receiving page and it fixed the issue I was seeing. Chrome must wait for those requests to complete while Firefox and IE kills them if they take too long.

于 2014-10-31T02:16:51.713 に答える
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」関数を提供していないことに注意してください。そのため、スニペットにそれを含めていないと仮定しています。また、クライアントはクライアントである必要があります。

于 2012-09-25T18:07:14.370 に答える