2016-07-09 7 views
0

Ich habe Asp. NET SignalR verwendet und meine Web-Anwendung-Index-Seite funktionierte gut mit SignalR, aber als ich begann, Detailseite mit dieser Push-Benachrichtigungen System habe ich Fehler - SignalR ruft die Methode meines Clients nicht auf der Detailseite auf.ASP.Net SignalR nicht Client-Methode

Hier ist meine Details Seite Code Rasierer:

<h2>last bidders</h2> 
<table class="table-info" style="width: 500px;"> 
    <thead> 
     <th>bidder</th> 
     <th>price</th> 
     <th>time</th> 
     <th>state</th> 
    </thead> 
    @for (int i = 0; i < 10; i++) 
    { 
     if (i < ViewBag.count) // Bidder exists 
     { 
      <tr> 
       <td id="@Html.Raw("bidder" + i)">@ViewBag.bidders[i]</td> 
       <td id="@Html.Raw("price" + i)">@ViewBag.prices[i]</td> 
       <td id="@Html.Raw("time" + i)">@ViewBag.times[i]</td> 
       <td id="@Html.Raw("state" + i)">@ViewBag.states[i]</td> 
      </tr> 
     } 
     else // No bidder - fill with blank 
     { 
      <tr> 
       <td id="@Html.Raw("bidder" + i)">&nbsp;</td> 
       <td id="@Html.Raw("price" + i)">&nbsp;</td> 
       <td id="@Html.Raw("time" + i)">&nbsp;</td> 
       <td id="@Html.Raw("state" + i)">&nbsp;</td> 
      </tr> 
     } 
    } 
</table> 

<input type="hidden" id="IDAuction" value="@ViewBag.IDAuction" /> 

@section scripts { 
<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script> 
<script src="~/signalr/hubs"></script> 
<script>   
    $(function() { 

     var my_hub = $.connection.myHub; 

     my_hub.client.auctionDetailsUpdate = function (IDAuction, newBidder, newPrice, newTime, newState) { 
      alert("auctionDetailsUpdate()"); 
      var x = document.getElementById("IDAuction").value; 
      alert('1'); 
      if (x == IDAuction) { 
       alert('2'); 
       moveRowsDown(); 
       alert('3'); 
       document.getElementById("time0").innerHTML = newTime; 
       document.getElementById("price0").innerHTML = newPrice; 
       document.getElementById("bidder0").innerHTML = newBidder; 
       document.getElementById("state0").innerHTML = newState; 
       alert('4'); 
      } 
     }; 

     // Client register on MyHub 
     $.connection.hub.start().done(function() { 
      $(document).ready(function() { 
       //my_hub.server.registerConId($("#clientEmail").val()); 
      }); 
     }); 

    }); 

    function moveRowsDown() { 
     alert('moverowsdown') 
     for (var i = 9; i > 0; i--) { 
      document.getElementById("time" + i).innerHTML = document.getElementById("time" + (i - 1)).innerHTML; 
      document.getElementById("price" + i).innerHTML = document.getElementById("price" + (i - 1)).innerHTML; 
      document.getElementById("bidder" + i).innerHTML = document.getElementById("bidder" + (i - 1)).innerHTML; 
      document.getElementById("state" + i).innerHTML = document.getElementById("state" + (i - 1)).innerHTML; 
     } 
    } 

</script> 

Hier ist mein Index Seite (ich nur einen entsprechenden Code zu SignalR gestellt habe, habe ich versucht, meine Frage nicht mit nutzlosen Informationen zu füllen in Code):

@section scripts { 
<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script> 
<script src="~/signalr/hubs"></script> 
<script> 

    $(function() { 

     var my_hub = $.connection.myHub; 

     // Server reply on bid attempt 
     my_hub.client.clientBidsUpdate = function (IDAuction, newState, newDuration, newLastBidder, newPrice, warningNoTokens) { 
      var clientEmail = $("#" + "email" + IDAuction).val(); 
      $("#" + "state" + IDAuction).text(newState); 
      $("#" + "time" + IDAuction).text(newDuration); 
      $("#" + "price" + IDAuction).text(newPrice); 
      // Unsuccessful bid 
      if (warningNoTokens == "true") { 
       if (newLastBidder == clientEmail) { 
        alert("Not enough tokens to place bigger bid. Please buy some tokens!"); 
       } 
      // Succesful bid 
      } else { 
       $("#" + "lastbidder" + IDAuction).text(newLastBidder); 
       $("#" + "spanPrice" + IDAuction).addClass("glyphicon glyphicon-arrow-up"); 
       $("#" + "spanPrice2" + IDAuction).addClass("glyphicon glyphicon-arrow-up"); 
      } 
     }; 

     // Increase previous bidder token number - someone has bigger bid 
     my_hub.client.setTokenNumber = function (clientSelector, tokenNumber, clientAlertSelector) { 
      document.getElementById(clientSelector).innerHTML = tokenNumber; 
      document.getElementById(clientAlertSelector).style.display = "inline-block"; 
     } 

     // Timer Update method // each 1 second 
     my_hub.client.timerUpdate = function (IDAuction, newState, newDuration, newLastBidder, newPrice) { 
      $("#" + "state" + IDAuction).text(newState); 
      $("#" + "time" + IDAuction).text(newDuration); 
      $("#" + "lastbidder" + IDAuction).text(newLastBidder); 
      $("#" + "price" + IDAuction).text(newPrice); 
      // Disable auction on client side 
      if (newState == "Sold" || newState == "Expired") { 
       if (newState == "Sold") { 
        $("#" + "btn" + IDAuction).html("Sold"); 
        $("#" + "btn" + IDAuction).removeClass("btn-warning btn").addClass("btn-info btn"); 
        $("#" + "btn" + IDAuction).css("background-color", "blueviolet"); 
        $("#" + "btn" + IDAuction).css("color", "white"); 
        $("#" + "state" + IDAuction).css("color", "blueviolet"); 
        $("#" + "spanLastBidder" + IDAuction).removeClass("glyphicon glyphicon-user").addClass("glyphicon glyphicon-ok"); 
        $("#" + "picture" + IDAuction).css("-webkit-filter", "blur(8px)").css("filter", "blur(8px)"); 
        $("#" + "btn" + IDAuction).prop("disabled", true); 
       } 
       else if (newState == "Expired") { 
        $("#" + "btn" + IDAuction).html("Expired"); 
        $("#" + "btn" + IDAuction).removeClass("btn-warning btn").addClass("btn-default btn"); 
        $("#" + "state" + IDAuction).css("color", "rgb(255, 54, 40)"); 
        $("#" + "spanLastBidder" + IDAuction).removeClass("glyphicon glyphicon-user").addClass("glyphicon glyphicon-remove"); 
        $("#" + "picture" + IDAuction).css("-webkit-filter", "blur(8px)").css("filter", "blur(8px)"); 
        $("#" + "btn" + IDAuction).prop("disabled", true); 
        $("#" + "btn" + IDAuction).css("background-color", "rgb(255, 54, 40)"); 
       } 
      } 
      $("#" + "spanPrice" + IDAuction).removeClass("glyphicon glyphicon-arrow-up"); 
      $("#" + "spanPrice2" + IDAuction).removeClass("glyphicon glyphicon-arrow-up"); 
      var clientEmail = document.getElementById("clientEmail").value; 
      var clientEmailReplaced = clientEmail.replace("@@", "_"); 
      document.getElementById("alertToken" + clientEmailReplaced).style.display = "none"; 
     }; 

     // Client sends bid to Server 
     $.connection.hub.start().done(function() { 
      $('.btnBid').click(function (event) { 
       var idBtnJquery = $(event.target).attr('id'); 
       var IDAuc = idBtnJquery.substring(3, idBtnJquery.length); 
       var clientEmail = $("#" + "email" + IDAuc).val(); 
       my_hub.server.send(IDAuc, clientEmail); 
      }); 
     }); 

     // Client register on MyHub 
     $.connection.hub.start().done(function() { 
      $(document).ready(function() { 
       my_hub.server.registerConId($("#clientEmail").val()); 
      }); 
     }); 

    }); 

    function htmlEncode(value) { 
     var encodedValue = $('<div />').text(value).html(); 
     return encodedValue; 
    } 

    // Variables 
    var toolbarVisible = false; 

    // Search - Menu toolbar preview 
    $("#showHideBtn").click(function() { 
     $("#menuSearchToolbar").slideToggle("slow", "swing"); 
     if (toolbarVisible == true) { 
      toolbarVisible = false; 
      $("#showHideBtn").removeClass("glyphicon glyphicon-chevron-up").addClass("glyphicon glyphicon-chevron-down"); 
     } else { 
      toolbarVisible = true; 
      $("#showHideBtn").removeClass("glyphicon glyphicon-chevron-down").addClass("glyphicon glyphicon-chevron-up"); 
     }     
    }); 

</script> 
} 

Hier ist meine Hubserver Klasse

namespace IEP_Projekat.Hubs 
{ 

public static class mutex 
{ 
    public static string lockObject = "MutEx"; 
} 

public class MyHub : Hub 
{ 
    private static Dictionary<string, string> hashUsersConnIds = new Dictionary<string, string>(512); 

    public void Send(long IDAuc, string lastBidderEmail) 
    { 
     lock (mutex.lockObject) 
     { 
      if ((productNewPrice <= user.TokenNumber)) 
      {  
       if (previousBidderID != null) 
       {   
        if (hashUsersConnIds.ContainsKey(previous.Email)) 
        { 
         Clients.Client(hashUsersConnIds[previous.Email]).setTokenNumber(clientSelector, newTokenCount, clientAlertSelector); 
        } 
        if (previous.Email != lastBidderEmail && hashUsersConnIds.ContainsKey(lastBidderEmail)) { 
         Clients.Client(hashUsersConnIds[lastBidderEmail]).setTokenNumber(clientSelector, newBidderCount, clientAlertSelector); 
        } 
       } 
       else 
       { 
        if (hashUsersConnIds.ContainsKey(lastBidderEmail)) 
        { 
         Clients.Client(hashUsersConnIds[lastBidderEmail]).setTokenNumber(clientSelector, newBidderCount, clientAlertSelector); 
        } 
       } 

       Clients.All.clientBidsUpdate(IDAuc, auction.state, remainingToEnd, lastBidderEmail, auction.price + auction.increment, "false"); 
       Clients.All.auctionDetailsUpdate(IDAuc, lastBidderEmail, auction.price + auction.increment, newBid.bidTime, "Open"); 
       return; 

      } 

      else if (auction.lastbidder == user.Email) 
      { 
       if (user.TokenNumber > 0) // can place next bid 
       { 
        if (hashUsersConnIds.ContainsKey(lastBidderEmail)) 
        { 
         Clients.Client(hashUsersConnIds[lastBidderEmail]).setTokenNumber(clientSelector, user.TokenNumber, clientAlertSelector); 
        } 

        Clients.All.clientBidsUpdate(IDAuc, auction.state, remainingToEnd, lastBidderEmail, auction.price + auction.increment, "false"); 
        Clients.All.auctionDetailsUpdate(IDAuc, lastBidderEmail, auction.price + auction.increment, newBid.bidTime, "Open");      
        return; 
       } 
      } 

      Clients.All.clientBidsUpdate(IDAuc, auction.state, remaining, lastBidderEmail, auction.price + auction.increment, "true"); 
     } 
    } 

    // Registring client 
    public void registerConId(string email) 
    { 
     hashUsersConnIds[email] = Context.ConnectionId; 
    } 

} 

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    {   
     Schedule(() => 
     { 
      lock (mutex.lockObject) 
      { 
       var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
       foreach (var auction in auctionsList) 
       { 
        if (now >= end) 
        { 

         if (edited.increment == 0) 
         { 
          hubContext.Clients.All.timerUpdate(auction.IDAuc, edited.state, newDurationExpired, " - ", edited.price); 
         } 
         else 
         { 
          hubContext.Clients.All.timerUpdate(auction.IDAuc, edited.state, newDurationSold, edited.lastbidder, soldPrice); 
          hubContext.Clients.All.auctionDetailsUpdate(auction.IDAuc, edited.lastbidder, soldPrice, newDurationSold, "Sold");        
         } 
        } 
        hubContext.Clients.All.timerUpdate(auction.IDAuc, auction.state, newDuration, auction.lastbidder, actualPrice); 
       } 
      } 
     }).ToRunNow().AndEvery(1).Seconds(); 
    } 
} 
} 

Hier ist meine Serverlogik. Ich verwende MyHub.cs als Hub-Klasse und Registry als Timer. Ich habe Code der Datenbankzugriffe und einige Berechnungen gereinigt, weil dieser Teil kein Problem hat, und ich wollte 350 Zeilen Code vermeiden, also habe ich gerade wichtigen Code in diesen SignalR-Interaktionen gelassen.

Ich habe Probleme mit Clients.All.auctionDetailsUpdate (...), während der Anwendung Webdebuggen es ist alles in Ordnung, und andere Verfahren SignalR Methoden sagt funktioniert, aber ich erhalte keine Benachrichtigung von meinen Angaben Seite angegeben in auctionDetailsUdate() -Methode wie es aus irgendeinem Grund hat Hub es nicht aufgerufen.

Antwort

0

Ich habe dieses Problem gelöst, indem ich Methoden implementiert habe, die auf dem Client (Javascript) aufgerufen werden.

Also habe ich hinzugefügt (mit leeren Stellen) auf details.cshtml

my_hub.client.timerUpdate = function (IDAuction, newState, newDuration, newLastBidder, newPrice) { } 
my_hub.client.setTokenNumber = function (clientSelector, tokenNumber, clientAlertSelector) { } 
my_hub.client.clientBidsUpdate = function (IDAuction, newState, newDuration, newLastBidder, newPrice, warningNoTokens) { } 

Und es scheint, dass Problem war, dass SignalR alle JavaScript-Methoden auf Ansichtsseiten implementiert haben braucht auch sie leere Körper haben .