2016-07-09 6 views
0

Ich bin neu in SignalR. Ich muss bestimmten ClientWie kann man mit SignalR mit bestimmten Clients kommunizieren?

hier kommunizieren, was ich bisher

EmployeeHub.cs

using Microsoft.AspNet.SignalR; 
using Microsoft.AspNet.SignalR.Hubs; 

namespace WebApplication1 
{ 
    public class EmployeeHub : Hub 
    { 
     [HubMethodName("NotifyClients")] 
     public static void NotifyCurrentEmployeeInformationToAllClients(string connectionID) 
     { 
      IHubContext context = GlobalHost.ConnectionManager.GetHubContext<EmployeeHub>(); 

      // update the specific connected client   
      context.Clients.Client(connectionID).updatedClients(); 
     } 
    } 
} 

HomeController.cs

using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Web.Mvc; 
using WebApplication1.Models; 

namespace WebApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     List<Employee> empList; 

     //Fetch Employee Records 
     public ActionResult Index() 
     { 
      return View(); 
     } 
     [HttpGet] 
     public ActionResult GetAllEmployeeRecords() 
     { 
      using (var context = new EmployeeContext()) 
      { 
       empList = context 
       .Employees 
       .ToList(); 
      }   
      return PartialView("_EmployeeList", empList); 
     } 


     //Insert Employee Record 
     public ActionResult Insert() 
     { 
      return View(); 
     } 
     [HttpPost]   
     public ActionResult Insert(DataPacket dataPacket) 
     { 
      if (ModelState.IsValid) 
      { 
       //Insert into Employee table 
       using (var context = new EmployeeContext()) 
       { 
        context.Employees.Add(dataPacket.Employee); 
        context.SaveChanges(); 
       } 
      } 

      //Once the record is inserted , then notify(Clients) 
      EmployeeHub.NotifyCurrentEmployeeInformationToAllClients(dataPacket.ConnectionID); 
      return RedirectToAction("Index"); 
     }  
} 

Datapacket getan haben. cs

public class Employee 
    { 
     [Key] 
     public int EmployeeID { get; set; } 
     public string EmployeeName { get; set; } 
     public string EmailAdress { get; set; } 
     public string MobileNumber { get; set; }  
    } 

    public class DataPacket 
    { 
     public Employee Employee { get; set; } 
     public string ConnectionID { get; set; } 
    } 

und schließlich meine Index.cshtml

@model IList<WebApplication1.Models.Employee> 
@{ 
    ViewBag.Title = "Index"; 
} 
<link href="~/Content/bootstrap/css/bootstrap.min.css" rel="stylesheet" /> 

<div>  
     <h1 style="color: green">CRUD using SignalR,MVC and Entity Framework</h1> 
     <table border="1">    
      ................................ 
     ................................ 
     </table> 
    <br /><br />  
     <div id="dataTable"></div> 
    </div> 

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

     $(function() { 
      // Create a proxy to signalr hub on web server. It reference the hub. 
      var notificationFromHub = $.connection.employeeHub; 

      // Connect to signalr hub 
      $.connection.hub.start().done(function() { 
       FetchEmployees(); 
      }); 

      // Notify to client with the recent updates 
      notificationFromHub.client.updatedClients = function() { 
       FetchEmployees(); 
      }; 
     }); 

     function FetchEmployees() { 
      var model = $('#dataTable'); 
      $.ajax({ 
       url: '/home/GetAllEmployeeRecords', 
       contentType: 'application/html ; charset:utf-8', 
       type: 'GET', 
       dataType: 'html' 
      }) 
       .success(function (result) { model.empty().append(result); })    
     } 

     // Insert Employee Record 
     function InsertEmployee() 
     { 


        var employee = { 
         EmployeeID: $('#txtEmployeeId').val(), 
         EmployeeName: $('#txtEmployeeName').val(), 
         EmailAdress: $('#txtEmail').val(), 
         MobileNumber: $('#txtMobile').val(),      
        }; 

        var dataPacket = { 
         Employee: employee, 
         ConnectionID: GenerateRandomNumbers() 
        } 

        $.ajax({ 
        url: '/home/Insert', 
        type: 'POST', 
        data: JSON.stringify(dataPacket), 
        contentType: "application/json;charset=utf-8", 
        success: function (data) { 
         alert('Employee added Successfully');      
        }, 
        error: function() { 
         alert('Employee not Added'); 
        } 
       }); 
     }   

     //Generate RandomNumbers 
     function GenerateRandomNumbers() { 
      var min = 1; 
      var max = 10; 
      return Math.floor(Math.random() * (max - min + 1) + min); 
     } 
    </script> 
} 

ich derzeit bin eine Zufallszahl für Testzwecke die Client-ID zu erzeugen. Das Problem besteht darin, dass der Datensatz der Datenbank hinzugefügt wird, die Benachrichtigung an den Client von SignalR jedoch erst erfolgt, wenn die Seite geladen wird.

z. Dies ist die Situation, wenn ich auf die Schaltfläche "Neuen Mitarbeiter hinzufügen" klicke.

enter image description here

Nur wird die Daten in der Tabelle reflektiert, wenn ich eine Aktualisierung der Seite zu tun wie

enter image description here

Ich habe auch zu this SO Q/A refered aber ich denke, ich bin etwas fehlt.

Was fehlt mir? Bitte helfen Sie.

Vielen Dank im Voraus.

Antwort

1

In SignalR ist ConnectionId eine spezifische Nummer für einen bestimmten verbundenen Client. Daher ist Ihre ConnectionID: GenerateRandomNumbers() nicht die gleiche Verbindungs-ID, mit der Ihr Client verbunden ist.

Um die spezifische Clientverbindungs-ID (specified here) abzurufen, sollten Sie die Verbindungs-ID aus der done()-Methode der ursprünglichen Hub-Verbindung erfassen und als globale Variable in Ihrem Skript speichern.

Wie z.

Dann in Ihrem AJAX-Anruf die tatsächliche Hub-Verbindungs-ID anstelle der Zufallszahlen liefern.

Schließlich, um es zu beenden, würde ich auch eine Methode zur Erkennung von Verbindungswiederholungen, Verbindungsunterbrechungen usw. bieten, wie weiter unten in diesem Handbuch aufgeführt, um die Verbindungs-ID zu aktualisieren/löschen, wenn es geändert oder getrennt wurde.

Verwandte Themen