2016-03-20 6 views
0

Ich entwickle eine Anwendung in asp.net mvc 5. In diesem Projekt benutze ich signalR, um die aktualisierten Daten in Echtzeit anzuzeigen. Das bedeutet, wenn sich Daten ändern, werden sie in der Anwendungsoberfläche geladen. Aber leider wird es nicht automatisch geladen, wenn ich die Seite nicht aktualisiere.SignalR Datenbank Update Benachrichtigung

Hier ist mein Code unten:

Hub : 

[HubName("statusLog")] 
public class StatusLogHub : Hub 
{ 

    [HubMethodName("sendExportStatus")] 
    public void SendExportStatus() 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>(); 
     Clients.All.updateStatus(); 
    } 
} 

Repository : 

public class EmailStatusLogRepository 
{ 

    readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

    public IEnumerable<EmailStatusLog> GetExportStatus() 
    { 
     var messages = new List<EmailStatusLog>(); 
     using (var connection = new SqlConnection(_connString)) 
     { 
      connection.Open(); 
      using (var command = new SqlCommand(@"SELECT * FROM dbo.EmailStatusLogs WHERE ExportStatus = 1 AND CAST(CONVERT(VARCHAR,Date,101) AS DATETIME)=CAST(CONVERT(VARCHAR,'" + DateTime.Now.Date.ToString("MM/dd/yyyy") + @"',101) AS DATETIME)", connection)) 
      { 
       command.Notification = null; 

       var dependency = new SqlDependency(command); 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 

       if (connection.State == ConnectionState.Closed) 
        connection.Open(); 

       var reader = command.ExecuteReader(); 

       while (reader.Read()) 
       { 
        messages.Add(item: new EmailStatusLog { Id = (int)reader["Id"], Investor_Code = (string)reader["Investor_Code"], EmailId = reader["EmailId"] != DBNull.Value ? (string)reader["EmailId"] : "", Date = (string)reader["Date"], ReportName = (string)reader["ReportName"], ExportStatus = (bool)reader["ExportStatus"], EmailSendStatus = (bool)reader["EmailSendStatus"], IsActive = (bool)reader["IsActive"] }); 
       } 
      } 

     } 
     return messages; 
    } 
    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     if (e.Type == SqlNotificationType.Change) 
     { 
      StatusLogHub statusLogHub = new StatusLogHub(); 
      statusLogHub.SendExportStatus(); 
     } 
    } 

} 

//Code from where I am updating DB: 

public void ExportStatus() 
    { 
     List<EmailStatusLog> lstEmailStatusLog = new List<EmailStatusLog>(); 
     EmailStatusLog objEmailStatusLog = new EmailStatusLog(); 
     foreach (var emailItem in lstEmailReceipent) 
     { 
      EMailDBContext _ctx = new EMailDBContext(); 
      objEmailStatusLog.EmailId = emailItem.stEmailAdd; 
      objEmailStatusLog.Investor_Code = emailItem.stInvestor_code; 
      objEmailStatusLog.Date = DateTime.Now.ToString("MM/dd/yyyy"); 
      objEmailStatusLog.ReportName = reportName; 
      objEmailStatusLog.ExportStatus = IsSuccess; 
      objEmailStatusLog.EmailSendStatus = false; 
      objEmailStatusLog.IsActive = true; 
      _ctx.emailStatusLogs.Add(objEmailStatusLog); 
      _ctx.SaveChanges(); 
      //StatusLogHub objStatusLogHub = new StatusLogHub(); 
      //objStatusLogHub.SendExportStatus(); 

     } 
    } 

Controller : 

public ActionResult GetExportStatus() 
    { 
     EmailStatusLogRepository objEmailStatusRepository = new EmailStatusLogRepository(); 
     return PartialView("_exportedReportList", objEmailStatusRepository.GetExportStatus()); 
    } 

Javascript: 

<script type="text/javascript" language="javascript"> 
//==================signalR 
$(function() { 
    var hub = $.connection.statusLog; 
    hub.client.updateStatus = function() { 
     getExportStatus() 
    }; 
    $.connection.hub.start().done(function() { 
     alert("connection started"); 
     // hub.server.sendExportStatus($('').val()); 
     getExportStatus(); 
    }).fail(function (e) { 
     alert(e); 
    }); 
}); 


function getExportStatus() { 
    var tbl = $('#statusTable'); 
    $.ajax({ 
     url: '@Url.Action("GetExportStatus")', 
     contentType: 'application/html ; charset:utf-8', 
     type: 'GET', 
     dataType: 'html' 
    }).success(function (result) { 
     tbl.empty().append(result); 
    }).error(function() { 

    }); 
} 

Antwort

0

Sie benötigen eine Client-Skript und Hub Klassenmethode zu ändern. In Nabe Verfahren müssen Sie GetExportStatus Methode als Argument übergeben, so dass Hub die Daten an alle Clients senden:

[HubName("statusLog")] 
public class StatusLogHub : Hub 
{ 

    [HubMethodName("sendExportStatus")] 
    public void SendExportStatus() 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>(); 
     EmailStatusLogRepository el = new EmailStatusLogRepository(); 
       Clients.All.updateStatus(el.GetExportStatus()); 
    } 
} 

Und auf Client-Seite:

$(function() 
     { 
      var hub = $.connection.statusLog; 
      hub.client.updateStatus = function(data) { 
//data contain all the data from repository this will call every time as repository updated 
       getExportStatus(data) 
      }; 
    $.connection.hub.start().done(function() { 
       //alert("connection started"); 
       hub.server.sendExportStatus(); 
      }).fail(function(e) { 
       alert(e); 
      }); 
     }); 


function getExportStatus(data) 
     { 
alert(data); 
      //you can put here logic for getting data on html. 
    } 
} 

Sie folgenden Link für Cross-Domain beziehen: enter link description here

+0

Dank @Rahul aber ich diesen Fehler von Client-Seite bekommen: Uncaught Typeerror: kann Eigenschaft 'sendExportStatus' undefinierten bei folgenden Methode lesen: .connection.hub.start(). done (function() { hub.server.sendExportStatus(); }). Fail (Funktion (e) { Alarm (e); }); }); – moinulmithu

+0

Ich denke Hub wurde nicht erstellt. Also Check-in Konfiguration –

+0

Es gibt eine Ausnahme in Javascript: Hub ist undefind – moinulmithu

0

Sie können Client-Skript versuchen, wie:

$(function() 
     { 
      var hubstatusLog = $.connection.statusLog; 
      hubstatusLog.client.updateStatus = function(data) { 
//data contain all the data from repository this will call every time as repository updated 
       getExportStatus(data) 
      }; 
    $.connection.hub.start(function() { 
hubstatusLog.server.sendExportStatus(); 
}); 
}); 

function getExportStatus(data) 
     { 
alert(data); 
      //you can put here logic for getting data on html. 
    } 

Server Hub:

[HubName("statusLog")] 
public class StatusLogHub : Hub 
{ 

    [HubMethodName("sendExportStatus")] 
    public void SendExportStatus() 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>(); 
     EmailStatusLogRepository el = new EmailStatusLogRepository(); 
       Clients.All.updateStatus(el.GetExportStatus()); 
    } 
} 
+0

Dank @Rahul. Aber eigentlich muss ich Hub verwenden, ohne Proxy zu generieren. Kannst du bitte einen Vorschlag dazu machen? – moinulmithu

+0

So können Sie den Link verweisen http://www.asp.net/signalr/overview/guide-to-the-api/hub-api-guide-javascript-client#genproxy –