SignalR, вызывающий плохой запрос 400, видимый на сервере

У нас проблема с сигналом. У нас есть сайт аукциона, который работает на signalr для ставок в реальном времени. Мы исправили некоторые проблемы с браузером, и все, казалось, работало хорошо. Затем мы установили новую реликвию на нашем сервере и заметили, что каждую минуту мы получаем код ошибки http 400 на signalr connect, reconnect и abort. Вот скриншот:

Новые реликвии

Соединение и повторное подключение SignalR - это наиболее трудоемкие операции сайта в соответствии с новой реликвией.

Вот базовый код SignalR (мы используем sql-сервер в качестве объединительной платы signalr):

public class SignalRHub : Hub
{
    public void BroadCastMessage(String msg)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>();

        hubContext.Clients.All.receiveMessage(msg);
    }
}

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        string appString=string.Empty;

        //Gets the connection string.
        if (System.Configuration.ConfigurationSettings.AppSettings["SignaRScaleoutConn"] != null)
        { 
            appString = System.Configuration.ConfigurationSettings.AppSettings["SignaRScaleoutConn"].ToString();
        }

        GlobalHost.DependencyResolver.UseSqlServer(appString);
        GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMinutes(15); //I added this timeout, but it is not required.
        app.MapSignalR();
    }
}

Клиент javascript выглядит так: он длинный, но большая часть его - это jQuery, чтобы повлиять на DOM, я включаю его все в том случае, если внутри него что-то может быть не так.

 $(function () {

            var chatProxy = $.connection.signalRHub;

            $.connection.hub.start();

            chatProxy.client.receiveMessage = function (msg) {

                var all = $(".soon").map(function () {

                    var hiddenModelId = $("#hiddenListingId");

                    if (msg == hiddenModelId.val()) {

                        $.ajax({
                            async: "true",
                            url: "/Listing/AuctionRemainingTime",
                            type: "POST",
                            dataType: 'json',
                            data: '{ "listingID": "' + msg + '"}',
                            contentType: "application/json; charset=utf-8",
                            success: function (data) {
                                if (data != null) {

                                    SoonSettings.HasReloadedThisTick = false;

                                    var element = document.getElementById(msg);

                                    var obj = JSON.parse(data)

                                    // For Clock Counter End Date Time Interval 
                                    // Adds 2 minutes to the soon clock when bid is close to finishing.
                                    var hdID = "hdn" + obj.ListingId;
                                    var hdValue = $("#" + hdID);
                                    if (obj.EndDate != hdValue.val()) {

                                        SoonSettings.HasUpdated = false; //Allows clock to change color once it gets under two minutes.

                                        $('#' + hdID).val(obj.EndDate);
                                        Soon.destroy(element);
                                        Soon.create(element, { //Recreates clock with the before 2 minute tick event.
                                            'due': 'in ' + obj.Seconds + ' seconds',
                                            'layout':'group label-uppercase',
                                            'visual':'ring cap-round progressgradient-00fff6_075fff ring-width-custom gap-0',
                                            'face':'text',
                                            'eventTick': 'tick'
                                        });
                                    }

                                    var highbid = obj.HighBidderURL;

                                    // For Date Ends Info.
                                    var ListingEndDate = $("#tdAuctionListingEndDate");

                                    if (obj.EndDate != ListingEndDate.val()) {
                                        $('#' + hdID).val(obj.EndDate);
                                        ListingEndDate.text(obj.EndDate + " Eastern");
                                        ListingEndDate.effect("pulsate", { times: 5 }, 5000);
                                    }
                                    else
                                    {
                                        $(".Bidding_Current_Price").stop(true, true); ///Removes the pulsating effect.
                                        $(".Bidding_Current_Price").removeAttr("style"); //Removes unnecessary attribute from HTML.
                                    }

                                    //Bid div notification.
                                    if (obj.AcceptedActionCount.replace(/[^:]+:*/, "") > 0) {

                                        if (obj.Disposition != '' && obj.Disposition != null) {
                                            if (obj.Disposition == "Neutral") {
                                                $("#spanNeutralBid").show();
                                                $("#divOutbidNotification").hide();
                                                $("#spanPositiveBid").hide();
                                                $("#divProxyBidNotification").hide();
                                            }
                                            else if (obj.Disposition == "Positive") {
                                                $("#spanPositiveBid").show();
                                                $("#divOutbidNotification").hide();
                                                $("#spanNeutralBid").hide();
                                                $("#divProxyBidNotification").hide();
                                            }
                                            else if (obj.Disposition == "Negative") {
                                                $("#divOutbidNotification").show();
                                                $("#spanNeutralBid").hide();
                                                $("#spanPositiveBid").hide();
                                                $("#divProxyBidNotification").hide();
                                            }
                                            else {
                                                $("#divOutbidNotification").hide();
                                                $("#spanNeutralBid").hide();
                                                $("#divProxyBidNotification").hide();
                                                $("#spanPositiveBid").hide();     
                                            }

                                        }
                                    }

                                    // For Highlight Current Price when it is Updated
                                    var hdCurrentPrice = $("#hdnCurrentPrice");

                                    if (obj.CurrentPrice != hdCurrentPrice.val()) {

                                        $(".Bidding_Current_Price").text(obj.CurrentPrice);
                                        $(".Bidding_Current_Price").effect("pulsate", { times: 5 }, 5000);
                                        $("#hdnCurrentPrice").val(obj.CurrentPrice);
                                    }
                                    else {
                                        $(".Bidding_Current_Price").stop(true, true);
                                        $(".Bidding_Current_Price").removeAttr("style");
                                    }

                                    // For ReservePrice Status
                                    $("#spanReservePriceStatus").html(obj.ReservePriceStatus);
                                    $("#smallReservePriceStatus").html(obj.ReservePriceStatus);

                                    // For Bid Count

                                    var spanBidCounter = $("#spanBidCount");

                                    $(spanBidCounter).text(obj.AcceptedActionCount);


                                    var stringAppend = "<tr id='trhHighBidder'><td><strong>HighBidder</strong></td>";
                                    stringAppend += "<td>";
                                    if (obj.isAdmin == true) {
                                        stringAppend += "<a id='anchorHighBid' href=" + obj.HighBidderURL + ">";
                                        stringAppend += "<span id='spanHighBidder'>" + obj.CurrentListingActionUserName + "</span>"
                                        stringAppend += "</a>";
                                    }
                                    else {
                                        stringAppend += "<span id='spanHighBidderAnonymous'>" + obj.CurrentListingActionUserName + "</span>";
                                    }
                                    stringAppend += "</td></tr>";

                                    if (obj.AcceptedActionCount.replace(/[^:]+:*/, "") > 0) {
                                        if ($("#tblAuctionDetail").find("#rowHighBidder").length > 0) {

                                            if ($("#tblAuctionDetail").find("#trhHighBidder").length > 0) {
                                                $("#trhHighBidder").remove();
                                            }
                                        }
                                        else {

                                            //add tr to table
                                            if (!$("#tblAuctionDetail").find("#trhHighBidder").length > 0) {
                                                $('#tblAuctionDetail > tbody > tr:eq(6)').after(stringAppend);
                                            }
                                        }
                                    }

                                    // For High Bidder

                                    if (obj.isAdmin) {

                                        var anchorElement = $("#anchorHighBid");
                                        $(anchorElement).attr("href", obj.HighBidderURL);

                                        var spanHighBidder = $("#spanHighBidder");
                                        $(spanHighBidder).text(obj.CurrentListingActionUserName);
                                    }
                                    else {
                                        var spanAdminHighBid = $("#spanHighBidderAnonymous");
                                        $(spanAdminHighBid).text(obj.CurrentListingActionUserName)
                                    }

                                }
                            },
                            error: function (xhr, textStatus, errorThrown) {

                            }
                        });
                    }
                });
            };

        });

Есть ли что-то не так с клиентом или сигнальным кодом сервера, который может потребоваться изменить, чтобы избежать таких ошибок, которые случаются так часто? Код 400 имеет тенденцию появляться почти каждую минуту. Я очень новичок в signalR и мало знаю о том, как сделать с ним эффективный код.

Ставки в реальном времени на сайте действительно работают, это просто найти способ избежать этих постоянных ошибок. Любая помощь, объясняющая что-либо из того, как работает сигнал, ценится.

Спасибо,

Ответ 1

Я бы попытался изменить способ транспортировки SignalR: http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#transport и проверьте, не устранена ли проблема.

Если возможно получить UserAgent из журнала плохого запроса, попробуйте сузить, какие браузеры получают 400 ошибок. Я думаю, может быть, некоторые браузеры не соединяются с правильным транспортным методом.