- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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 应用程序(在本地主机上)发出 POST Http 请求以发送数据(我为此使用 CLR 函数)。
处理完数据后,我将它们打包以供 HttpWebRequest
使用,将它们在 Service Broker 中排队以避免影响其他事件,然后就完成了。
我已经注销了SqlDependency
,因为这会迫使我查询数据 - 这不是一个很大的优势(我会牺牲本地主机 HTTP 请求来换取在 SQL Server 上运行的查询)
同时我觉得应该有一种更简洁的方法来做到这一点。
有什么建议吗?
最佳答案
嗯,我对 SignalR.Client.NET.35 库的认识有点晚了。
在撰写本文时,它尚未打包在 NuGet 中,因此代码必须是 downloaded来自 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);
}
}
重要注意事项:您必须将以下 dll 与已编译的 SQL SERVER 2008R2 CLR 库一起放置在同一文件夹中:
最终在 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,我使用了服务代理,以便我确信函数执行的任何问题都与处理数据的存储过程解耦
关于asp.net-mvc - 使用 SignalR 将数据从 SQL Server 推送到 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001205/
我是一名优秀的程序员,十分优秀!