从SQL Server将数据推送到与SignalR的Web应用程序(Pushing data fro

2019-06-25 10:24发布

我的ASP.NET MVC 4 Web应用程序是显示频繁更新的数据到客户端。 从外部源和由SQL Server 2008 R2处理(安装在服务器上的应用程序)的数据起源。

目前,数据流是相当传统:从ASP.NET客户调查,ASP.NET依次轮询其从SQL Server。

为了避免轮询(现在是我需要的Web应用程序的用户之间的实时互动),我改变推的办法,用signalR广播数据给客户端。 这增加了用户体验的平滑度,也减少了客户端与ASP.NET服务器之间轮询的开销。

现在的问题是反相SSRV和ASP.NET之间的流动:我想从SSRV推数据ASP.NET中最有效的方式。

SSRV运行昂贵的查询输入一些外部数据 - 一旦数据被处理,他们也准备通过广播在互联网上共享。

我现在可怜的人的做法:发出POST HTTP请求发送到Web应用程序(在本地主机上)发送数据(我用了一个CLR函数)。

一旦数据被处理,我收拾他们准备好了HttpWebRequest ,他们排队在服务代理,以避免影响其他活动,我完成了。

我已经注销SqlDependency正如逼我来查询数据-不是一个很大的优势(我会权衡的SQL Server上运行查询本地主机的HTTP请求)

同时,我觉得应该是这样做一个更合适的方法。

有什么建议?

Answer 1:

好吧,我意识到有点晚了关于SignalR.Client.NET.35库。

在写这篇文章的时候,它是不是打包的NuGet,所以必须对代码进行下载从GitHub的SignalR项目现场,并添加了一个项目,该解决方案(包括SignalR.Client.NET和所需SignalR.Client.NET35)。

下面是最终的解决方案,如果它可以帮助别人的未来:

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

重要提示注意:在编译SQL SERVER 2008R2 CLR库的话,那就必须把下列DLL在同一文件夹:

  • Newtonsoft.Json
  • SignalR.Client.Net35明显
  • SMdiagnostics
  • System.Runtime.Serialization
  • System.ServiceModel在正确的版本(参见版本在C在GAC指出:\ WINDOWS \组件不兼容的情况下)。
  • 的System.Threading

终于在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我用一个服务代理,这样我相信,随着功能的执行任何问题从存储过程中处理数据解耦



Answer 2:

你看SignalR ? 你可以用它来异步数据推送到你的UI(尽管它不是一个真正的推)。 这可能不是你的具体情况可以接受的,但我建议考虑看看。 可能是你所需要的。 希望帮助。



文章来源: Pushing data from SQL Server to Web Application with SignalR