edd*_*ddo 9 asp.net-mvc server-push sql-server-2008 signalr
我的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运行昂贵的查询来导入一些外部数据 - 一旦数据被处理,它们也可以通过广播在互联网上共享.
我当前的穷人方法:向Web应用程序(在localhost上)发出POST Http请求以发送数据(我正在使用CLR函数).
处理完数据后,我将它们打包准备好,将HttpWebRequest它们排入Service Broker中以避免影响其他活动,我就完成了.
我已经注销,SqlDependency因为它会强制我查询数据 - 这不是一个很大的优势(我会在SQL Server上运行查询的localhost HTTP请求)
与此同时,我觉得应该有一个更简洁的方法来做到这一点.
有什么建议?
好吧,我意识到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);
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意的重要事项:与编译的SQL SERVER 2008R2 CLR库一起,您必须将以下dll放在同一个文件夹中:
最后在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
Run Code Online (Sandbox Code Playgroud)
要调用ut_sendMsgToHub,我使用服务代理,以便确保执行函数的任何问题都与处理数据的存储过程分离.
| 归档时间: |
|
| 查看次数: |
6078 次 |
| 最近记录: |