将消息从 SSIS (2012) 包推送到 ASP.NET Web 应用程序中的 SignalR 集线器——最好的方法是啥?

Posted

技术标签:

【中文标题】将消息从 SSIS (2012) 包推送到 ASP.NET Web 应用程序中的 SignalR 集线器——最好的方法是啥?【英文标题】:Pushing messages from an SSIS (2012) package to a SignalR hub in an ASP.NET web app -- what is the best approach?将消息从 SSIS (2012) 包推送到 ASP.NET Web 应用程序中的 SignalR 集线器——最好的方法是什么? 【发布时间】:2013-09-02 14:55:53 【问题描述】:

我有一个长期运行的 SSIS 包,其中包含许多数据流任务(有关 SSIS 的更多信息,请参阅this question)。在这些任务之间,我想将实时状态更新发送到 SignalR 集线器,该集线器在 IIS 7.0 中托管的面向 Intranet 的 ASP.NET MVC 4 应用程序中运行,以便用户可以查看进度。

从 SSIS 向 SignalR 集线器客户端发送状态更新消息的最佳方式是什么?

以下 SSIS 任务似乎能够将消息传递到外部系统:

SSIS 消息队列任务:起初在服务器上使用 MSMQ 私有队列听起来很容易,但 MSMQ 有点过时、无人维护并且缺乏文档。也没有明显的方法可以与现有的启用 SignalR 的 Web 应用程序集成。有一个write-up about a self-hosted SignalR hub with connections to MSMQ,但是这种方法可以在 ASP.NET MVC 应用程序中实现吗?

SSIS 执行 SQL 任务: 我已经从 SSIS 执行此操作(更新作业表中的 status_id),因此最难的部分是检测这些更改并通过SignalR 集线器。 SignalR already can use SQL Server for scaling out,但此技术假设所有消息都是通过一个 SignalR 集线器开始的,但这里的情况并非如此。其他人谈论使用SqlDependency,但这是否可以让 ASP.NET 应用程序查看数据库表并收到所有更新的通知?

使用 SSIS 脚本任务发送 HTTP 请求 (C#): 仔细想想,这似乎是最直接的路线,但有一些注意事项。我正在构建的 Web 应用程序经过 NTLM 身份验证,因此我需要将 System.Net.WebRequest 与身份验证一起使用,这在 SSIS 中可能有问题,也可能没有问题。

关于 #3 的更新:SSIS 包正在 SQL Server 中运行。如果我使用System.Net.CredentialCache.DefaultNetworkCredentials 对站点进行身份验证,则运行它的 Windows 帐户将无法授权。因此,WebRequest 似乎只有在可以使用备用 NTLM 凭据(即 not 从运行包的帐户派生)的情况下才能在这种情况下工作。该站点不接受基本的 HTTP 身份验证。

更新 2:看起来 System.Net.NetworkCredentials 可以用任意域/用户/密码实例化并应用于 WebRequest。我尚未在 SSIS 任务中的生产环境中对此进行测试。这个问题仍然悬而未决,因为维护许多相同的 SSIS 脚本任务(或开发可重用的 SSIS 任务)相当麻烦。可能会有更简单、更快或更易于维护的解决方案。

关于赏金奖励的更新 3:400 代表的赏金将颁发给提出可行策略并至少提供一些基本细节的最佳答案。

【问题讨论】:

您正在数据流任务中传输数据,是吗?它基本上是这些包的 OLE DB 目标的 OLE DB 源吗?您的最终目标是了解在当前时刻有多少行从源移动到接收器,是吗? 另外,将数百万(低、中、高?)从一个地方转移到另一个地方需要多长时间?这似乎是一个相当直接的任务和快速的操作,除非你在那里有二进制数据或会堵塞管道的东西。 我正在使用 SSIS 数据流,因为它是每秒传输 20,000+ 行的唯一直接途径。 SSIS 任务有几个步骤(数据流等)——目标是向网络浏览器发送更新,以便它们可以密切关注状态。 Roy,我正在查看您列表中的选项#3。您是否在 SQL Server 进程之外执行 SSIS 包?如果您在一个进程帐户下运行整个 SSIS 包,这将有助于在 System.Net.WebClient 的帮助下对 HTTPRequest 进行身份验证,这个请求发送将在 ScriptTask 的帮助下进行,它们将在相关的数据流任务之后执行。 在 Update#2 上,SSIS 包将具有可用于在成功或错误时触发其他任务的事件,因此如果处理了事件并在脚本/自定义任务上被调用,则存在可重用性,但确实如此这将在包内:),但方法可以重复使用。 【参考方案1】:

SSIS 消息队列任务

如果您使用它,您将不得不将消息发布到队列(MSMQ 是具有文件数据库的服务)。消息可以是任何你想要的。然后你必须编写一个 Windows 服务来轮询 MSMQ 队列中的消息(或注册到 MSMQ 事件)并使用 C# signalr 客户端将消息传输到 Web 客户端。

+: MSMQ itself is reliable, MSMQ can post the message to other MSMQ
+: MSMQ will retain messages if they can not be delivered
-: All servers having MSMQ must be in the same Active Directory domain.
-: The service is not easy to write, if an error occurs in it all messages in the queue can be blocked (if the problematic message stays at the top of the queue)
-: It is not so easy to setup the security of MSMQ
-: There is no tool to recover the file db if it crashes.

我的想法是,如果您的消息通过本地网络/*** 远距离传输,并且您的消息必须到达并且永远不会丢失,那么您可以使用 MSMQ。

在您的情况下,如果消息没有到达,这不是灾难性的......

执行 SQL 任务

不要更新自己的信号器数据库。这不是一个可靠且长期有效的解决方案。

也不要在 SQL 表上使用监视功能(它称为 Service Broker)。根据我的经验,它不可靠,它不断断开连接,无缘无故拒绝(重新)连接,而且 C# api 很糟糕。事实上,您只收到一个更改通知,然后您自己找出更改并重新注册以进行更改。

您可以做的是使用包括信号器客户端的 CLR 存储过程。但是,如果您有 sql 2008R2 或更低版本,则它必须是 .NET 2.0,这是 signalr 不支持的(我很确定,但应该验证)。参考:http://technet.microsoft.com/en-us/library/ms131103.aspx

使用 SSIS 脚本任务发送 HTTP 请求(使用 NTLM)

HTTP 请求是最好的方法。您可以将代码放在 CLR 存储过程中,这样它就可以重用,并使用执行 sql 任务。参考:http://technet.microsoft.com/en-us/library/ms190790(v=sql.105).aspx

【讨论】:

获得赏金。感谢您提供有关每种方法的优缺点的有用信息,以及将 HTTP 请求放入 CLR 存储过程的好建议。干杯!【参考方案2】:

我认为您可以为此目的使用 SQL Server 服务代理。

此外,似乎有人取得了类似的成就: Pushing data from SQL Server to Web Application with SignalR

【讨论】:

很好的解决方案......但很危险。真的可以进化吗?您是否相信 .NET 2 代码将始终与 .NET 4 服务器代码兼容?这是一个“类似开源的”库,我自己不会相信这个解决方案。开源人士通常不喜欢维护“旧技术”版本。【参考方案3】:

我会简单地采用 #3 并在本地安装 ntlmaps(启用自定义 NTML 凭据的代理服务器)并在配置文件中正确定义 network settings。

【讨论】:

以上是关于将消息从 SSIS (2012) 包推送到 ASP.NET Web 应用程序中的 SignalR 集线器——最好的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

maven 将jar包推送到自己本机的maven库

从 ASP.NET 执行 SSIS 包时出错

工作经验项目打成的Jar包推送到公司私服nexus

工作经验项目打成的Jar包推送到公司私服nexus

将结果从 RabbitMQ 队列推送到 CakePHP 前端

为啥从目录执行 ssis 包时访问文件路径被拒绝消息