2012-03-26 9 views
3

Ist es möglich, SignalR in Kombination mit SqlCacheDependency (oder SqlDependency) zu verwenden, um Datenbankaktualisierungen direkt an den Browser zu senden? Vielleicht gibt es eine andere Möglichkeit, diese Funktionalität zu erreichen? Das einzige, was ich jetzt funktioniere, ist, dass ich addMessage von dem asynchronen Aufruf aufrufen muss, der eine Aktualisierung der Datenbank durchführt, aber das deckt nicht wirklich die Aktualisierungen von verschiedenen Quellen ab (zum Beispiel ein Hintergrunddienst, der die Tabelle aktualisiert)).Verwenden von SignalR mit SqlDependency, um Datenbankaktualisierungen zu übertragen

Antwort

1

Ok, ich es herausgefunden, oder zumindest eine Möglichkeit, es zu tun.

Was ich anfangs nicht verstanden habe, ist, dass Sie diesen Code innerhalb eines MVC Controllers verwenden müssen, sobald Sie das getan haben, können Sie diesen Controller natürlich auch von jedem anderen Ort oder von jeder anderen Anwendung aus aufrufen WebRequest Klasse.

@Hightechrider Um der Vollständigkeit halber, müssen Sie 2 weitere Verweise einschließen, um dieses Stück Code arbeiten zu lassen. Dieser Demo-Code wurde mit einer PersistentConnection erstellt, aber das Prinzip für den Hub ist natürlich dasselbe.

EDIT: Ich benutze jetzt einen Thread in meinem asp.net mvc, um die sqldependency zu verwalten, das fühlt sich an wie eine integrierte Lösung. prüfen diesen Beitrag auf, wie die Hintergrundverarbeitung in asp.net „den richtigen Weg“ http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc;  

using SignalR.Infrastructure; 
using SignalR.Hosting.AspNet; 
using SignalR; 

namespace SignalRDemo.Controllers 
{ 
    public class DemoController : Controller 
    { 
     public void sendMessage(string message) 
     { 
      IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
      IConnection connection = connectionManager.GetConnection<MyConnection>(); 

      connection.Broadcast(message); 
     } 
    } 
} 
+1

Warum müssen Sie die SQL-Abhängigkeit in einem separaten Prozess überwachen? Sie könnten es einfach in einem Thread überwachen, der unter ASP.NET ausgeführt wird, es sei denn, es gibt Gründe für eine Infrastruktur, warum Ihre Website Ihre Datenbank nicht direkt überwachen kann. In jedem Fall sollten Sie die neue ASP.NET-Web-API besser verwenden, wenn Sie eine solche API verwenden möchten, und Sie sollten es wahrscheinlich zu einer HttpPost-API machen, um zufällige (oder böswillige) Aufrufe einfach durch einen Besuch zu verhindern eine Internetseite. –

+0

@Hightechrider thx für Ihre Antwort, ich habe geplant, Authentifizierung zu implementieren, um böswillige Verwendung zu verhindern, aber ein Beitrag wäre wahrscheinlich immer noch besser zu verwenden. Ich bin nicht sicher, wie man einen getrennten Thread von innerhalb meiner asp.net mvc Anwendung beginnt, an welchem ​​Punkt sollte ich den Faden anfangen (ich denke in Application_start von globalem asax, aber ich bin nicht sicher) –

+0

Ja, es startend in Global.asax ist typisch. Natürlich kann der AppPool im Leerlauf heruntergefahren werden (aus diesem Grund benötigen Sie normalerweise einen Dienst), aber in Ihrem Fall ist es egal, ob niemand die Site nutzt (durch SignalR oder auf andere Weise), ob die Datenbank aktualisiert wird. –

5

Sie sollten the OnChange event on a SQLDependency verwenden können. In Ihrem Event-Handler können Sie eine Nachricht über SignalR senden. Da Sie von außen in die Hub-Aufruf werden Sie brauchen die Technik at the bottom of the documentation here gezeigt verwenden:

using SignalR.Infrastructure; 

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
dynamic clients = connectionManager.GetClients<MyHub>(); 
... 
+0

Gerade FYI umzusetzen, planen wir eine ScaleOut Lösung zu implementieren, basierend auf SQL diesen Mechanismus verwenden. – davidfowl