代码之家  ›  专栏  ›  技术社区  ›  Bradley Uffner

身份验证无法使用Azure服务总线发送消息

  •  0
  • Bradley Uffner  · 技术社区  · 6 年前

    我一直在使用Azure服务总线,并一直在跟踪 this 微软的教程。

    我正处于尝试向队列发送消息的阶段,但我收到一个身份验证错误:

    身份验证失败,因为远程方已关闭 传输流。

    在Microsoft.azure.servicebus.core.messagesender.d_u53.moveNext()上 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()时 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在Microsoft.Azure.ServiceBus.RetryPolicy.D_uu18.MoveNext()上 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()时 在Microsoft.Azure.ServiceBus.RetryPolicy.D_uu18.MoveNext()上 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()时 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在microsoft.azure.servicebus.core.messagesender.d_uu40.moveNext()上 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()时 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在sender.program.d_uu0.moveNext()中,C:\repos\serviceBusTest\sender\program.cs:line 27

    还有一个内部异常,消息几乎相同,这表明问题与TLS/SSL有关:

    身份验证失败,因为远程方已关闭传输流。

    at system.net.security.sslstate.startreadframe(byte[]buffer,int32 readbytes,asyncProtocolRequest asyncRequest) at system.net.security.sslstate.partialframecallback(AsyncProtocolRequest异步请求) 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()时 at system.net.security.sslstate.InternalEndProcessAuthentication(LazyAsyncResult LazyResult) at system.net.security.sslstate.endProcessAuthentication(IAsyncResult结果) 在System.NET.Security.SSLStream.EndAuthenticateAsClient上(IAsyncResult AsyncResult) 在system.threading.tasks.taskfactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2端功能,动作 1 endAction, Task 1承诺,布尔要求同步) 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()时 在
    [剪短…]

    可以看到此堆栈跟踪的其余部分 here .

    await queueClient.SendAsync(message);
    

    以下代码中的一个(ConnectionString的某些部分已用“*******”):

    namespace CoreSenderApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            // Connection String for the namespace can be obtained from the Azure portal under the 
            // 'Shared Access policies' section.
            const string ServiceBusConnectionString = 
                "Endpoint=sb://le********est.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=aZDFcj****************v4=";
            const string QueueName = "testbus";
            static IQueueClient queueClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                const int numberOfMessages = 10;
                queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
                Console.WriteLine("======================================================");
    
                // Send Messages
                await SendMessagesAsync(numberOfMessages);
    
                Console.ReadKey();
    
                await queueClient.CloseAsync();
            }
    
            static async Task SendMessagesAsync(int numberOfMessagesToSend)
            {
                try
                {
                    for (var i = 0; i < numberOfMessagesToSend; i++)
                    {
                        // Create a new message to send to the queue
                        string messageBody = $"Message {i}";
                        var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                        // Write the body of the message to the console
                        Console.WriteLine($"Sending message: {messageBody}");
    
                        // Send the message to the queue
                        await queueClient.SendAsync(message);
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
                }
            }
        }
    }
    

    我相信 ServiceBusConnectionString QueueName 是核心设置的,因为如果我更改这些值,在 QueueClient 已实例化。

    我已经尽我所能地仔细学习了本教程,但我无法克服这个错误。我还搜索了谷歌,但还没有找到其他遇到这个问题的人。我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Bradley Uffner    6 年前

    这被证实是由于公司网络安全干扰了到Azure“East US 2”资源组位置中资源的传出TLS连接造成的。在调整了一些防火墙规则之后,一切都按预期工作。