【问题标题】:Publish to Azure Service Bus over http behind proxy通过代理后面的 http 发布到 Azure 服务总线
【发布时间】:2012-09-05 12:35:46
【问题描述】:

我使用 Azure ServiceBus API 发布到服务总线。 sb 协议在防火墙后面不起作用。因此,我将 ServiceBusEnvironment.SystemConnectivity.Mode 设置为 ConnectivityMode.Http。只要我直接连接到互联网,它就可以工作。即使在配置了 http 代理之后,这在我的办公室也行不通。 ServiceBus API 有问题吗?感谢您在这方面的帮助。

下面是我使用的一段代码......

    public static void Initialize()
    {
        // Using Http to be friendly with outbound firewalls
        ServiceBusEnvironment.SystemConnectivity.Mode =
            ConnectivityMode.Http;

        //InitializeQueue();
    }


    // The name of your queue
    public const string QueueName = "ordersqueue";

    public static NamespaceManager CreateNamespaceManager()
    {
        // Create the namespace manager which gives you access to
        // management operations
        var uri = ServiceBusEnvironment.CreateServiceUri(
            "sb", Namespace, String.Empty);
        var tP = TokenProvider.CreateSharedSecretTokenProvider(
            IssuerName, IssuerKey);
        return new NamespaceManager(uri, tP);
    }

    private static void InitializeQueue()
    {
        // Create the namespace manager which gives you access to 
        // management operations
        var namespaceManager = CreateNamespaceManager();

        // Create the queue if it does not exist already
        if (!namespaceManager.QueueExists(QueueName))
        {
            namespaceManager.CreateQueue(QueueName);
        }

        // Get a client to the queue
        var messagingFactory = MessagingFactory.Create(
            namespaceManager.Address,
            namespaceManager.Settings.TokenProvider);
        OrdersQueueClient = messagingFactory.CreateQueueClient(
            QueueName);
    }

下面是我得到的堆栈跟踪...................... ..................................................... ......

Microsoft.ServiceBus.Messaging.MessagingCommunicationException was unhandled
  Message=Unable to connect to ServiceBus using HTTP connectivity mode
  Source=Microsoft.ServiceBus
  IsTransient=true
  StackTrace:
       at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result)
       at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.OnEndSend(IAsyncResult result)
       at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.OnSend(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout)
       at Microsoft.ServiceBus.Messaging.MessageSender.Send(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout)
       at Microsoft.ServiceBus.Messaging.MessageSender.Send(BrokeredMessage message)
       at Microsoft.ServiceBus.Messaging.QueueClient.Send(BrokeredMessage message)
       at AzureServiceBusPublisher.QueueConnector.send(String arg) in C:\Users\prasanh\Documents\Visual Studio 2010\Projects\AzureServiceBusPublisher\AzureServiceBusPublisher\QueueConnector.cs:line 72
       at AzureServiceBusPublisher.Program.sendMessagesToQueue() in C:\Users\prasanh\Documents\Visual Studio 2010\Projects\AzureServiceBusPublisher\AzureServiceBusPublisher\Program.cs:line 23
       at AzureServiceBusPublisher.Program.Main(String[] args) in C:\Users\prasanh\Documents\Visual Studio 2010\Projects\AzureServiceBusPublisher\AzureServiceBusPublisher\Program.cs:line 13
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.ServiceModel.CommunicationException
       Message=Unable to connect to ServiceBus using HTTP connectivity mode
       Source=Microsoft.ServiceBus
       StackTrace:
         Server stack trace: 
            at Microsoft.ServiceBus.WebStream..ctor(Uri factoryEndpointUri, String webSocketRole)
            at Microsoft.ServiceBus.WebSocketConnection..ctor(Uri factoryEndpointUri, String webSocketRole, Int32 asyncReadBufferSize)
            at Microsoft.ServiceBus.WebSocketOnewayConnectionInitiator.Connect(Uri uri, TimeSpan timeout)
            at Microsoft.ServiceBus.WebSocketOnewayConnectionInitiator.BeginConnect(Uri uri, TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.BufferedConnectionInitiator.BeginConnect(Uri uri, TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.ConnectionPoolHelper.EstablishConnectionAsyncResult.OpenUsingNewConnection()
            at Microsoft.ServiceBus.Channels.ConnectionPoolHelper.EstablishConnectionAsyncResult.Begin()
            at Microsoft.ServiceBus.Channels.ConnectionPoolHelper.EstablishConnectionAsyncResult..ctor(ConnectionPoolHelper parent, TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.ConnectionPoolHelper.BeginEstablishConnection(TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.ClientFramingDuplexSessionChannel.OpenAsyncResult..ctor(ClientFramingDuplexSessionChannel duplexChannel, TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.ClientFramingDuplexSessionChannel.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.CommunicationObject.OpenAsyncResult..ctor(CommunicationObject communicationObject, TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.CommunicationObject.BeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.LayeredChannel`1.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.CommunicationObject.OpenAsyncResult..ctor(CommunicationObject communicationObject, TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Channels.CommunicationObject.BeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)
            at System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult.InvokeOpen()
            at System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult..ctor(CommunicationObject communicationObject, TimeSpan timeout, AsyncCallback callback, Object state)
            at System.ServiceModel.Channels.CommunicationObject.BeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)
            at Microsoft.ServiceBus.Messaging.Channels.SharedChannel`1.GetInstanceAsyncResult.<GetAsyncSteps>b__3(GetInstanceAsyncResult thisPtr, TimeSpan t, AsyncCallback c, Object s)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.EnumerateSteps(CurrentThreadType state)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.Start()
         Exception rethrown at [0]: 
            at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.End(IAsyncResult asyncResult)
            at Microsoft.ServiceBus.Messaging.Channels.SharedChannel`1.OnEndCreateInstance(IAsyncResult asyncResult)
            at Microsoft.ServiceBus.Messaging.SingletonManager`1.EndGetInstance(IAsyncResult asyncResult)
            at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<GetAsyncSteps>b__f(RequestAsyncResult thisPtr, IAsyncResult r)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.EnumerateSteps(CurrentThreadType state)
         Exception rethrown at [1]: 
            at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.End(IAsyncResult asyncResult)
            at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result)
            at Microsoft.ServiceBus.Messaging.Sbmp.SbmpTransactionalAsyncResult`1.<GetAsyncSteps>b__44(TIteratorAsyncResult thisPtr, IAsyncResult a)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.EnumerateSteps(CurrentThreadType state)
         Exception rethrown at [2]: 
            at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
            at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.End(IAsyncResult asyncResult)
            at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result)
       InnerException: System.ServiceModel.CommunicationException
            Message=Unable to connect downstream
            Source=Microsoft.ServiceBus
            StackTrace:
                 at Microsoft.ServiceBus.WebStream.CreateDownStreamRequest(Uri endpointLocation)
                 at Microsoft.ServiceBus.WebStream.StartSession(Uri readEndpoint, Uri writeEndpoint)
                 at Microsoft.ServiceBus.WebStream..ctor(Uri factoryEndpointUri, String webSocketRole)
            InnerException: System.Net.WebException
                 Message=The remote server returned an error: (403) Forbidden.
                 Source=System
                 StackTrace:
                      at System.Net.HttpWebRequest.GetResponse()
                      at Microsoft.ServiceBus.WebStream.CreateDownStreamRequest(Uri endpointLocation)
                 InnerException: 

【问题讨论】:

    标签: azure servicebus


    【解决方案1】:

    您得到的详细异常是什么?

    根据我的经验,很多代理的默认配置不支持 HTTP 1.1。 HTTP 1.1 是服务总线正常工作所必需的。

    除此之外,我建议您查看guide to troubleshoot connectivity to Service Bus

    【讨论】:

    • 您遇到的详细异常应该有“无法使用 HTTP 连接模式连接到 ServiceBus”之类的消息,并且在异常链的更深处应该有“HTTP/1.0 协议不支持分块编码上传”。
    • 谢谢。我收到错误消息“无法使用 HTTP 连接模式连接到 ServiceBus”,但在深处它没有分块错误。相反,它有错误消息“远程服务器返回错误:(403)禁止”。为什么我会收到此错误?通过 sb 协议连接时我没有收到此错误,在没有代理连接时我也没有收到此错误。
    • 我想您检查了troubleshooting guide 中的所有内容:通过浏览器访问、ping 测试以及代理后面的其他所有内容都可以吗?指南中的第 4 节(代理配置)可能有用。 IMO 它可能是与代理有关的问题,即使我可能会发现 HTTP 403 错误有点令人困惑。你的代码没问题,凭据也是,否则它将通过 TCP 失败;因此,网络访问是需要进一步调查的剩余领域。
    • 对不起。当我启用代理时,我已经删除了上述内容并将其替换为实际的错误消息。我猜 StackOverflow 没有完全删除它。完整的堆栈跟踪在问题陈述中给出。内部异常是“无法连接下游”,而外部异常是“无法使用 HTTP 连接模式连接到 ServiceBus”。通过浏览器访问工作正常。
    • 抱歉,除了查看实时/记录的请求,代理拒绝/丢弃(ISA/TMG 可以提供此信息)来调查问题的根本原因,我没有更多提示可以分享...也许 Todd Reifsteck 可以提供帮助。
    【解决方案2】:

    微软本周发布了新的服务总线 API。请参阅下面的链接 http://msdn.microsoft.com/en-us/library/windowsazure/hh667331.aspx#New_SB 我已经在服务总线 1.8 中测试了这个问题。还是同样的错误。谁能指导我微软是否解决了这个问题?

    【讨论】:

      【解决方案3】:

      我是 Windows Azure 服务总线团队的一名 SDE。请尝试发布的指南。

      另请注意,从 SDK 1.7 开始,服务总线消息传递仅适用于支持 POST 分块的 HTTP 1.1 代理。我们正在为此制定长期解决方案,即将推出的 SDK 1.8 允许 Service Bus Relay 使用 HTTPS 而不是 POST 分块来处理这些代理以及 HTTP 1.0 代理。

      我们还知道,某些 Cisco 代理(可能还有其他代理)需要名称地址才能尝试任何 IP 地址连接。我们正在为此制定长期解决方案。

      【讨论】:

      • 很高兴知道您正在解决我们每天面临的问题:我们大约 40% 的客户拥有默认阻止 HTTP 1.1 的防火墙。
      • 谢谢你们俩。我如何知道我的代理是否支持 HTTP 1.1?我通过代理进行 webex 共享,我相信它使用 HTTP 1.1 功能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多