Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Pushen von Daten von SQL Server an die Webanwendung mit SignalR

Nun, mir ist etwas spät die SignalR.Client.NET.35-Bibliothek aufgefallen.

Zum Zeitpunkt des Schreibens ist es nicht in NuGet verpackt, daher muss der Code heruntergeladen von der GitHub SignalR Project Site und als Projekt zur Lösung hinzugefügt (sowohl SignalR.Client.NET und SignalR.Client.NET35 erforderlich).

Hier ist die endgültige Lösung, falls sie in Zukunft jemandem 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 beachten:Zusammen mit der kompilierten SQL SERVER 2008R2 CLR-Bibliothek müssen Sie die folgenden DLLs im selben Ordner ablegen:

  • Newtonsoft.Json
  • SignalR.Client.Net35 offensichtlich
  • SM-Diagnose
  • System.Laufzeit.Serialisierung
  • System.ServiceModel in der richtigen Version (bei Inkompatibilitäten siehe Version wie im GAC in C:\Windows\assembly angegeben).
  • 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 

Um ut_sendMsgToHub aufzurufen, verwende ich einen Service-Broker, damit ich sicher bin, dass jedes Problem mit der Ausführung der Funktion von den gespeicherten Prozeduren, die die Daten verarbeiten, entkoppelt wird