Подключение к служебной шине Azure из служб SSIS

Мне нужно поместить сообщение в очередь Azure ServiceBus из пакета служб SSIS, работающего под управлением SQL Server 2014. Как предлагается в этом посте: при подключении к очереди Azure Service Bus из ssis я написал задачу сценария, которая ссылается на "Azure SDK 2.9". Этот подход работал для меня с учетными записями хранения Azure для работы с BLOB-объектами (ссылается на сборку Microsoft.WindowsAzure.Storage), но он НЕ работает для шины хранения Azure (ссылается на сборку Microsoft.ServiceBus). Любые вызовы, которые я делаю в эту сборку, вызывают исключение времени выполнения: "исключение было сгенерировано целью вызова: at System.RuntimeMethodHandle.InvokeMethod(...)" Когда я закомментирую все вызовы сборки Microsoft.ServiceBus он работает нормально, так что это явно что-то о сборке ссылки (версия 2.4). Я попытался обновить до последней версии с NuGet (версия 3.0), и это не имело никакого значения.

Итак, мой вопрос: кто-нибудь смог поместить сообщение в очередь Azure Service Bus из служб SSIS, и если да, то как вы это сделали?

Так как кто-то спросит мой код задачи скрипта, я публикую его:

#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
    }
}

1 ответ

Поэтому, конечно, через 10 минут после того, как я отправил вопрос, я нашел ответ. Я должен был запустить GACUTIL -i Microsoft.ServiceBus. Как только это было сделано, я решил использовать Третий метод в коде (самый простой) для отправки сообщения, и он работал нормально.

Другие вопросы по тегам