从 SSIS 连接到 Azure 服务总线

斯科特·邓肯

我需要将一条消息从 SQL Server 2014 下运行的 SSIS 包中放入 Azure ServiceBus 队列。正如这篇文章中所建议的:connecting to azure service bus queue from ssis,我写了一个引用“Azure SDK 2.9”的脚本任务。这种方法适用于 Azure 存储帐户以处理 blob(引用 Microsoft.WindowsAzure.Storage 程序集),但它不适用于 Azure 存储总线(引用 Microsoft.ServiceBus 程序集)。我对该程序集进行的任何调用都会触发运行时异常:“调用目标已抛出异常:在 System.RuntimeMethodHandle.InvokeMethod(...)” 当我注释掉对 Microsoft.ServiceBus 程序集的所有调用时它运行良好,因此显然与程序集参考(2.4 版)有关。我尝试使用 NuGet(3.0 版)更新到最新版本,但没有任何区别。

所以我的问题是:是否有人能够将消息放入来自 SSIS 的 Azure 服务总线队列,如果是这样,您是如何做到的?

由于有人会要求我的脚本任务代码,我将其发布:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
#endregion

#region CustomNamespaces
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
#endregion

namespace ST_dba6519c1eda4e0c968485a6eb7a6c29
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            try
            {
                // Create the message for the Queue
                string ClientShortName = Dts.Variables["$Package::ClientShortName"].Value.ToString();
                bool bExtendedForecast = (bool)Dts.Variables["$Package::ExtendedForecast"].Value;
                var msg = new BrokeredMessage(ClientShortName + ": ExtendedForecast=" + bExtendedForecast.ToString());  // this statement throws the exception

                // get Service Bus Connection Information from the Package Parameters
                string SBAccessKey = Dts.Variables["$Package::ServiceBusAccessKey"].Value.ToString();
                string SBNamespace = Dts.Variables["$Package::ServiceBusNamespace"].Value.ToString();
                string SBQueue = Dts.Variables["$Package::ServiceBusQueueName"].Value.ToString();
                String connStr = "Endpoint=sb://" + SBNamespace +
                        ".servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=" + SBAccessKey;

                // First Method tried
                Uri SBUri = ServiceBusEnvironment.CreateServiceUri(String.Empty, SBNamespace, String.Empty); // this statement throws the exception
                TokenProvider SBToken = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", SBAccessKey);
                NamespaceManager nsMgr = new NamespaceManager(SBUri, SBToken);
                MessagingFactory msgFactory = MessagingFactory.Create(nsMgr.Address, nsMgr.Settings.TokenProvider);
                QueueClient queueClient2 = msgFactory.CreateQueueClient(SBQueue);
                queueClient2.Send(msg);

                // Second Method tried
                MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connStr); // this statement throws the exception
                MessageSender queueSender = factory.CreateMessageSender(SBQueue);
                queueSender.Send(msg);

                // Third Method tried
                QueueClient queueClient = QueueClient.CreateFromConnectionString(connStr, SBQueue); // this statement throws the exception
                queueClient.Send(msg);

                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }
        #region ScriptResults declaration
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion
    }
}
斯科特·邓肯

所以,当然,在我发布问题 10 分钟后,我找到了答案。我必须运行 GACUTIL -i Microsoft.ServiceBus。完成后,我选择使用代码中的第三种方法(最简单的)来发送消息,并且效果很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章