2012-06-12 9 views
9

Meine ASP.NET MVC 4-Webanwendung zeigt häufig aktualisierte Daten für den Client an. Daten stammen von einer externen Quelle (eine auf dem Server installierte Anwendung) und werden von SQL Server 2008 R2 verarbeitet.Daten von SQL Server an Webanwendung mit SignalR übertragen

Derzeit ist der Datenfluss recht traditionell: Clients fragt ASP.NET ab, ASP.NET wiederum von SQL Server.

Um die Abfrage zu vermeiden (und jetzt, dass ich eine Echtzeit-Interaktion zwischen den Benutzern der Webanwendung benötige), ändere ich die Methode Push, wobei signalR verwendet wird, um Daten an Clients zu senden. Dies erhöht die Benutzerfreundlichkeit und reduziert den Aufwand für die Abfrage zwischen Clients und ASP.NET-Server.

Das Problem ist jetzt invertieren den Fluss zwischen SSRV und ASP.NET: Ich möchte die Daten von SSRV zu ASP.NET auf die effizienteste Art und Weise zu schieben.

SSRV führt teure Abfragen durch, um einige externe Daten zu importieren - und sobald die Daten verarbeitet sind, sind sie auch bereit für die gemeinsame Nutzung über das Internet via Broadcast.

Mein aktueller armer Mann Ansatz: eine POST HTTP-Anfrage an die Web-Anwendung (auf localhost), um die Daten zu senden (Ich verwende eine CLR-Funktion dafür).

Sobald die Daten verarbeitet sind, packe ich sie bereit für die HttpWebRequest, sie in einem Service Broker einreihen, um Auswirkungen auf die anderen Aktivitäten zu vermeiden, und ich bin fertig.

Ich habe abgeschriebene SqlDependency wie mich für die Daten abzufragen zwingen würde - keine großer Vorteil

Zur gleichen Zeit (ich würde eine localhost HTTP-Anforderung für eine Abfrage ausführen, auf dem SQL Server abwägen) Ich fühle mich Es sollte einen besseren Weg geben, dies zu tun.

Irgendwelche Vorschläge?

Antwort

7

Nun, Ich habe ein wenig spät über die SignalR.Client.NET.35-Bibliothek realisiert.

des Schreibens Zu der Zeit wird es nicht in NuGet verpackt, so dass der Code downloaded aus der GitHub SignalR Projekt-Website und fügte als Projekt zur Lösung (beide SignalR.Client.NET und SignalR sein muss. Client.NET35 erforderlich). Hier

ist die endgültige Lösung, falls es jemand in der Zukunft helfen kann:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using System.Xml; 
using Microsoft.SqlServer.Server; 
using System.Data.SqlTypes; 
using System.Net; 
using System.IO; 
using System.Xml.XPath; 
using SignalR.Client.Hubs; 

    internal static HubConnection connectionT = null; 
    internal static IHubProxy msgHubT = null; 

    /// <summary> 
    /// allows SSRV to send a message to the Web Socket hub 
    /// </summary> 
    /// <param name="URL">URL of the Hub</param> 
    /// <param name="hubName">Name of the message Hub to be used for broadcasting.</param> 
    /// <param name="hubMethod">Hub method to be used for broadcasting.</param> 
    /// <param name="message">Message to be broadcasted.</param> 
    [SqlFunction()] 
    public static void ut_sendMsgToHub(string URL, string hubName, string hubMethod, string message) 
    { 
     try 
     { 
     if (connectionT == null) 
     { 
      connectionT = new HubConnection(URL.Trim()); // "http://localhost:56844/M2Hub" 
     } 
     if (msgHubT == null) 
     { 
      msgHubT = connectionT.CreateProxy(hubName.Trim());//"M2data" 
     } 

      if (!(connectionT.State == SignalR.Client.ConnectionState.Connected 
       || connectionT.State == SignalR.Client.ConnectionState.Reconnecting 
       || connectionT.State == SignalR.Client.ConnectionState.Connecting)) 
       connectionT.Start().Wait(); 
      msgHubT.Invoke(hubMethod.Trim(), message.Trim()).Wait();//"Send" 
     } 
     catch (Exception exc) 
     { 
      SqlContext.Pipe.Send("ut_sendMsgToHub error: " + exc.Message + Environment.NewLine); 
     } 
    } 

Wichtig zu bemerken: zusammen mit der kompilierten SQL Server 2008R2 CLR-Bibliothek finden Sie die folgenden DLLs setzen müssen im selben Ordner:

  • Newtonsoft.Json
  • SignalR.Client.Net35 offensichtlich
  • SMdiagnostics
  • System.Runtime.Serialization
  • System.ServiceModel in der richtigen Version (auf Version beziehen, wie in dem GAC in C angegeben: \ Windows \ Montag bei Inkompatibilitäten).
  • System.Threading

schließlich in SQL SERVER:

CREATE ASSEMBLY CLR_Bridge from 'C:\PathToLibraries\Library_CLR.dll' 
WITH PERMISSION_SET = UNSAFE --UNSAFE required 
CREATE PROCEDURE ut_sendMsgToHub 
@url nchar(125) , 
@hubName nchar(75), 
@hubMethod NCHAR(75), 
@message NVARCHAR(MAX) 
AS 
EXTERNAL NAME CLR_Bridge.[LibraryNamespace.CLR_Bridge].ut_sendMsgToHub 

ut_sendMsgToHub nennen ich einen Service-Broker verwenden, so dass ich sicher bin, dass irgendein Problem mit der Ausführung der Funktion von dem entkoppelten Gespeicherte Prozeduren, die die Daten verarbeiten

+1

die Jungs von SignalR habe freundlich half mir mit ein paar Bemerkungen über diesen Ansatz gegen Plain POST - Sie können den Thread [hier] lesen (https://github.com/SignalR/SignalR/issues/626) – eddo

+0

Sind Sie direkt Serving Daten von SQL Server ** Clr dll ** (SignalR Server) zu signalisieren R Clients? Welche Art von vs-Projekt ist diese DLL? Klassenbibliothek oder SQL Server-Datenbankprojekt? – ibubi

1

Haben Sie sich SignalR angesehen? Sie können es verwenden, um Daten asynchron an Ihre Benutzeroberfläche zu senden (obwohl es kein echter Push ist). Dies mag für Ihre spezifische Situation nicht akzeptabel sein, aber ich würde vorschlagen, einen Blick darauf zu werfen. Könnte sein, was du brauchst. Ich hoffe, das hilft.

+1

Wie ich oben geschrieben habe, benutze ich bereits SignalR, das Problem ist der Datenfluss zwischen SSRV und dem Web App Server, nicht zwischen dem Web App Server und dem Client ... – eddo

Verwandte Themen