2016-04-01 14 views
11

Występuje problem z signalR. Mamy stronę aukcyjną, która działa na signalr dla licytowania w czasie rzeczywistym. Naprawiliśmy niektóre problemy z przeglądarką i wszystko działało dobrze. Następnie zainstalowaliśmy nową relację na naszym serwerze i zauważyliśmy, że co minutę otrzymujemy kod błędu http 400 na łączniku signalr, ponowne połączenie i przerwanie. Oto zrzut ekranu:SygnałR powodujący niepoprawne żądanie 400 widziane na serwerze

New Relic Data

SignalR podłączyć i ponownie są najbardziej czasochłonne operacje na miejscu zgodnie z nową relikwię.

Oto SignalR kod backend (Używamy serwera SQL jako signalr tylna ściana):

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(); 
    } 
} 

Klient javascript wygląda tak, że to długie, ale większość z nich jest jQuery wpływa na DOM, I umieścić go wszystko na wypadek, gdyby coś w tym było nie tak.

$(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) { 

          } 
         }); 
        } 
       }); 
      }; 

     }); 

Czy coś jest nie tak z klientem lub kodem sygnału z serwera, które może wymagać zmiany, aby uniknąć takich błędów tak często? Kod 400 ma tendencję do pokazywania się niemal co minutę. Jestem bardzo nowym użytkownikiem signalR i wiem bardzo niewiele o tym, jak zrobić z nim skuteczny kod.

Licytowanie w czasie rzeczywistym na stronie działa, wystarczy znaleźć sposób na uniknięcie tych ciągłych błędów. Każda pomoc wyjaśniająca wszystko, co działa signalR, jest doceniana.

Dzięki,

+2

Otrzymujemy też czasami te same błędy. Używamy magistrali usługowej jako płyty montażowej. Myślę, że jest to związane z backplane i loadbalancerem. Czy masz loadbalancer lub autoskalowanie? –

+0

Mamy system równoważenia obciążenia, interesujący. Nie myślałem o tym, powodując ten problem. –

+0

co znajduje się w treści odpowiedzi "Złe żądanie"? –

Odpowiedz

Powiązane problemy