sql >> Base de Datos >  >> RDS >> Sqlserver

Envío de datos de SQL Server a la aplicación web con SignalR

Bueno, me di cuenta un poco tarde de la biblioteca SignalR.Client.NET.35.

Al momento de escribir, no está empaquetado en NuGet, por lo que el código debe ser descargado desde el sitio del proyecto SignalR de GitHub y agregado como un proyecto a la solución (ambos SignalR.Client.NET y SignalR.Client.NET35 obligatorio).

Aquí está la solución final, en caso de que pueda ayudar a alguien en el futuro:

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);
        }
    }

Importante tener en cuenta:junto con la biblioteca SQL SERVER 2008R2 CLR compilada, deberá colocar los siguientes dlls en la misma carpeta:

  • Newtonsoft.Json
  • SignalR.Client.Net35 obviamente
  • SMdiagnóstico
  • Sistema.Tiempo de ejecución.Serialización
  • System.ServiceModel en la versión correcta (consulte la versión como se indica en el GAC en C:\Windows\assembly en caso de incompatibilidades).
  • Sistema.Subprocesamiento

finalmente en 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 

Para llamar a ut_sendMsgToHub utilizo un intermediario de servicios para estar seguro de que cualquier problema con la ejecución de la función se desvincula de los procedimientos almacenados que procesan los datos