Ho sviluppato una pagina Web che si collega all'hub signalR che si collega al codice jquery con angularjs. Ai client viene inviato un messaggio quando si verifica un evento sqldependency.onchange
, tuttavia, per ogni client connesso il messaggio viene duplicato a ciascuno. Quindi, se due client sono connessi, ciascun client riceve due messaggi e così via.Messaggi duplicati SignalR su sqlDipendenza cambia
Ecco i passaggi:
- collegare due clienti al mozzo
- fare il cambiamento DB
- sqlDependency.onchange incendi
- chiamata di funzione hub
clients.all.renewProducts()
- Ricrea dati respository azzeramento della dipendenza Console client
- :
"Database SQL Dependency change detected: Update" app.js:44:12 (Twice)
Hub.cs
public static void SignalRGetData(string data)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<SignalRGetData>();
context.Clients.All.renewData(data);
// Recereate data and sql dependency
new DataRespository().GetData();
}
DataRespository.cs _dependency_OnChange
public void _dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if(e.Info == SqlNotificationInfo.Update)
{
ProductHub.GetProducts("Database SQL Dependency change detected: " + e.Info);
}
}
GetData
public IEnumerable<ProductInventoryDetail> GetData()
{
using(var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DynamicPricing"].ConnectionString))
{
conn.Open();
var reposQuery =
"SELECT [ID], [Program] FROM [DBO].[Detail]";
using(SqlCommand cmd = new SqlCommand(reposQuery, conn))
{
// remove any command object notifications
cmd.Notification = null;
// create dependency
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange += new OnChangeEventHandler(_dependency_OnChange);
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
// Execute Sql Command
using(var reader = cmd.ExecuteReader())
{
return reader.Cast<IDataRecord>().Select(x => new ProductInventoryDetail(){
ID = x.GetInt32(0),
Program = x.GetInt32(1)
}
}
}
}
}
angolare JavaScript
// Apply jQuery SignalR operations to Angular
app.value('$', $);
app.factory('signalRService', ['$', '$rootScope', function ($, $rootScope) {
var proxy = null;
var initialise = function() {
// Get Connection to SignalR Hub
var connection = $.hubConnection();
// Create a Proxy
proxy = connection.createHubProxy('SignalRData');
// Publish the event when server has a push notification
proxy.on('renewProducts', function (message) {
console.log("Database SQL Dependency change detectedgnalRGetData: " + message);
$rootScope.$emit('renewProducts', message);
});
// Start Connection
connection.start().done(function() {
console.log("Conenction Ready - invoke proxy");
proxy.invoke('SignalRGetData');
});
};
return {
initialise: initialise
}
}]);
È possibile che si stia effettuando la connessione due volte sulla stessa pagina? (chiamando initialize due volte in controller diversi). – sirrocco
Sarebbe questo il caso definendo un servizio angolare? – goingsideways
No, ma se nella stessa pagina sono presenti 2 controller e entrambi ricevono il segnaleRService ed entrambi chiamano il metodo di inizializzazione, aprono due connessioni. – sirrocco