使用 .Net Framework .4.5.2 将消息发送到 Azure 服务总线队列
Sending a message to a Azure Service Bus queue using .Net Framework .4.5.2
我目前正在尝试向 Azure 服务总线队列发送消息,但似乎总是 运行 出错。
这是我的例子。
namespace azure_queue
{
class sendtoAzure
{
public async Task sendAsync(string message)
{
const string ServiceBusConnectString = "<connection-string>";
const string QueueName = "<QueueName>";
var AzureClient = Microsoft.ServiceBus.Messaging.QueueClient.CreateFromConnectionString(ServiceBusConnectString, QueueName);
await AzureClient.SendAsync(new Microsoft.ServiceBus.Messaging.BrokeredMessage(message));
}
}
class Program
{
static void Main(string[] args)
{
string transferObject_string = "This is a test";
Microsoft.ServiceBus.Messaging.BrokeredMessage message = new Microsoft.ServiceBus.Messaging.BrokeredMessage(transferObject_string);
Console.WriteLine("Sending message to azure");
sendtoAzure client = new sendtoAzure();
try
{
client.sendAsync(transferObject_string).Wait(TimeSpan.FromSeconds(60));
}
catch (System.Exception ex)
{
Console.WriteLine("Exception: " + ex.StackTrace);
Console.WriteLine("Message: " + ex.Message);
Console.WriteLine("HelpLink: " + ex.HelpLink);
Console.WriteLine("Source: " + ex.Source);
Console.ReadLine();
if (ex is System.TimeoutException)
{
Console.WriteLine("Timeout exeption");
}
if (ex is System.ArgumentException)
{
Console.WriteLine("Message is empty");
}
if (ex is System.UnauthorizedAccessException)
{
Console.WriteLine("Unauthorized access!");
}
if (ex is Microsoft.ServiceBus.Messaging.SessionCannotBeLockedException)
{
Console.WriteLine("Attempt to accept a session with a specific session ID, but the session is currently locked by another client.");
}
}
Console.WriteLine("Message Sent!");
Console.ReadLine();
}
}
}
我收到的错误消息是:
Sending message to azure
Exception: at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at azure_queue.Program.Main(String[] args) in C:\Users\keer\Source\Repos\azure_queue\azure_queue\Program.cs:line 39
Message: One or more errors occurred.
HelpLink:
Source: mscorlib
Message Sent!
我也尝试过不使用 async,这很有效,但是当我检查门户时,似乎没有任何东西进入队列。这个错误可能是由什么引起的?
与 send
相同的示例
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ServiceBus;
using System.Configuration;
using System.Messaging;
using System.ServiceModel;
using System.Net;
namespace azure_queue
{
public class sendtoAzure
{
public string ServiceBusConnectString;
public string QueueName;
public Microsoft.ServiceBus.Messaging.QueueClient AzureClient;
public sendtoAzure()
{
ServiceBusConnectString = "<connectionstring>";
QueueName = "<Queue-name>";
AzureClient = Microsoft.ServiceBus.Messaging.QueueClient.CreateFromConnectionString(ServiceBusConnectString, QueueName);
}
public void send (string message)
{
AzureClient.Send(new Microsoft.ServiceBus.Messaging.BrokeredMessage(message));
}
}
class Program
{
static void Main(string[] args)
{
string transferObject_string = "This is a test";
Microsoft.ServiceBus.Messaging.BrokeredMessage message = new Microsoft.ServiceBus.Messaging.BrokeredMessage(transferObject_string);
Console.WriteLine("Sending message to azure");
sendtoAzure client = new sendtoAzure();
try
{
client.send(transferObject_string);
}
catch (System.Exception ex)
{
Console.WriteLine("Exception: " + ex.StackTrace);
Console.WriteLine("Message: " + ex.Message);
Console.WriteLine("HelpLink: " + ex.HelpLink);
Console.WriteLine("Source: " + ex.Source);
Console.WriteLine("InnerExeption: " + ex.InnerException);
Console.ReadLine();
if (ex is System.TimeoutException)
{
Console.WriteLine("Timeout exeption");
}
if (ex is System.ArgumentException)
{
Console.WriteLine("Message is empty");
}
if (ex is System.UnauthorizedAccessException)
{
Console.WriteLine("Unauthorized access!");
}
if (ex is Microsoft.ServiceBus.Messaging.SessionCannotBeLockedException)
{
Console.WriteLine("Attempt to accept a session with a specific session ID, but the session is currently locked by another client.");
}
}
Console.WriteLine("Message Sent!");
Console.ReadLine();
}
}
}
给出此错误 - 包括内部执行:
Sending message to azure
Exception: at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.RunSynchronously()
at Microsoft.ServiceBus.Messaging.MessageSender.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 azure_queue.sendtoAzure.send(String message) in C:\Users\keer\Source\Repos\azure_queue\azure_queue\Program.cs:line 30
at azure_queue.Program.Main(String[] args) in C:\Users\keer\Source\Repos\azure_queue\azure_queue\Program.cs:line 45
Message: 40400: Endpoint not found., Resource:sb://x-shared.servicebus.windows.net/x%20-%20test. TrackingId:fd30b288-cc6a-4360-9922-0b044e9de8f4_G28, SystemTracker:x-shared.servicebus.windows.net:x%20-%20test, Timestamp:6/28/2018 1:57:25 PM
HelpLink:
Source: Microsoft.ServiceBus
InnerExeption: System.ServiceModel.FaultException: 40400: Endpoint not found., Resource:sb://x-shared.servicebus.windows.net/x%20-%20test. TrackingId:fd30b288-cc6a-4360-9922-0b044e9de8f4_G28, SystemTracker:x-shared.servicebus.windows.net:x%20-%20test, Timestamp:6/28/2018 1:57:25 PM
at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.ThrowIfFaultMessage(Message wcfMessage)
at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.HandleMessageReceived(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<>c.<GetAsyncSteps>b__9_3(RequestAsyncResult thisPtr, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.RedirectBindingElement.RedirectContainerChannelFactory`1.RedirectContainerSessionChannel.RequestAsyncResult.<>c__DisplayClass8_1.<GetAsyncSteps>b__4(RequestAsyncResult thisPtr, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
at Microsoft.ServiceBus.Messaging.Sbmp.RedirectBindingElement.RedirectContainerChannelFactory`1.RedirectContainerSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<>c.<GetAsyncSteps>b__9_3(RequestAsyncResult thisPtr, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.SbmpTransactionalAsyncResult`1.<>c.<GetAsyncSteps>b__18_3(TIteratorAsyncResult thisPtr, IAsyncResult a)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result)
我能够使用您的 sendAsync() 方法实现成功发送代理消息。
此外,当队列不存在(例如 taskqueue1)时,我能够重现您问题中所述的相同错误。
Message: 40400: Endpoint not found., Resource:sb://{valid service bus namespace}.servicebus.windows.net/taskqueue1. TrackingId:7ce43d17-d339-4ded-b3be-71364a64f685_G17, SystemTracker:{valid service bus namespace}.servicebus.windows.net:taskqueue1, Timestamp:7/1/2018 1:23:04 AM...
从您发布的异常中提取的端点中的队列名称 x%20-%20test 似乎无效,因为有空格(例如 %20)。
sb://x-shared.servicebus.windows.net/x%20-%20test
So, please double check that the Azure Service Bus queue name is correct/valid and that it does exit.
此外,您使用的 Azure 服务总线 FQDN可能是正确的。否则,将抛出以下异常,而不是您问题中描述的异常:
Microsoft.ServiceBus.Messaging.MessagingCommunicationException: The remote name could not be resolved: '{nonexistent service bus namespace}.servicebus.windows.net'...
可以将消息发送到 Azure 服务总线队列,如下所示
namespace ServiceBus_Queue
{
class Program
{
const string ServiceBusConnectionString = "";
const string QueueName = "";
static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
var queueClient = QueueClient.CreateFromConnectionString(ServiceBusConnectionString, QueueName);
string Message = "I'm in Azure Service Bus Queue";
BrokeredMessage message = new BrokeredMessage(Message);
await queueClient.SendAsync(message);
}
}
}
我目前正在尝试向 Azure 服务总线队列发送消息,但似乎总是 运行 出错。
这是我的例子。
namespace azure_queue
{
class sendtoAzure
{
public async Task sendAsync(string message)
{
const string ServiceBusConnectString = "<connection-string>";
const string QueueName = "<QueueName>";
var AzureClient = Microsoft.ServiceBus.Messaging.QueueClient.CreateFromConnectionString(ServiceBusConnectString, QueueName);
await AzureClient.SendAsync(new Microsoft.ServiceBus.Messaging.BrokeredMessage(message));
}
}
class Program
{
static void Main(string[] args)
{
string transferObject_string = "This is a test";
Microsoft.ServiceBus.Messaging.BrokeredMessage message = new Microsoft.ServiceBus.Messaging.BrokeredMessage(transferObject_string);
Console.WriteLine("Sending message to azure");
sendtoAzure client = new sendtoAzure();
try
{
client.sendAsync(transferObject_string).Wait(TimeSpan.FromSeconds(60));
}
catch (System.Exception ex)
{
Console.WriteLine("Exception: " + ex.StackTrace);
Console.WriteLine("Message: " + ex.Message);
Console.WriteLine("HelpLink: " + ex.HelpLink);
Console.WriteLine("Source: " + ex.Source);
Console.ReadLine();
if (ex is System.TimeoutException)
{
Console.WriteLine("Timeout exeption");
}
if (ex is System.ArgumentException)
{
Console.WriteLine("Message is empty");
}
if (ex is System.UnauthorizedAccessException)
{
Console.WriteLine("Unauthorized access!");
}
if (ex is Microsoft.ServiceBus.Messaging.SessionCannotBeLockedException)
{
Console.WriteLine("Attempt to accept a session with a specific session ID, but the session is currently locked by another client.");
}
}
Console.WriteLine("Message Sent!");
Console.ReadLine();
}
}
}
我收到的错误消息是:
Sending message to azure
Exception: at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at azure_queue.Program.Main(String[] args) in C:\Users\keer\Source\Repos\azure_queue\azure_queue\Program.cs:line 39
Message: One or more errors occurred.
HelpLink:
Source: mscorlib
Message Sent!
我也尝试过不使用 async,这很有效,但是当我检查门户时,似乎没有任何东西进入队列。这个错误可能是由什么引起的?
与 send
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ServiceBus;
using System.Configuration;
using System.Messaging;
using System.ServiceModel;
using System.Net;
namespace azure_queue
{
public class sendtoAzure
{
public string ServiceBusConnectString;
public string QueueName;
public Microsoft.ServiceBus.Messaging.QueueClient AzureClient;
public sendtoAzure()
{
ServiceBusConnectString = "<connectionstring>";
QueueName = "<Queue-name>";
AzureClient = Microsoft.ServiceBus.Messaging.QueueClient.CreateFromConnectionString(ServiceBusConnectString, QueueName);
}
public void send (string message)
{
AzureClient.Send(new Microsoft.ServiceBus.Messaging.BrokeredMessage(message));
}
}
class Program
{
static void Main(string[] args)
{
string transferObject_string = "This is a test";
Microsoft.ServiceBus.Messaging.BrokeredMessage message = new Microsoft.ServiceBus.Messaging.BrokeredMessage(transferObject_string);
Console.WriteLine("Sending message to azure");
sendtoAzure client = new sendtoAzure();
try
{
client.send(transferObject_string);
}
catch (System.Exception ex)
{
Console.WriteLine("Exception: " + ex.StackTrace);
Console.WriteLine("Message: " + ex.Message);
Console.WriteLine("HelpLink: " + ex.HelpLink);
Console.WriteLine("Source: " + ex.Source);
Console.WriteLine("InnerExeption: " + ex.InnerException);
Console.ReadLine();
if (ex is System.TimeoutException)
{
Console.WriteLine("Timeout exeption");
}
if (ex is System.ArgumentException)
{
Console.WriteLine("Message is empty");
}
if (ex is System.UnauthorizedAccessException)
{
Console.WriteLine("Unauthorized access!");
}
if (ex is Microsoft.ServiceBus.Messaging.SessionCannotBeLockedException)
{
Console.WriteLine("Attempt to accept a session with a specific session ID, but the session is currently locked by another client.");
}
}
Console.WriteLine("Message Sent!");
Console.ReadLine();
}
}
}
给出此错误 - 包括内部执行:
Sending message to azure
Exception: at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.RunSynchronously()
at Microsoft.ServiceBus.Messaging.MessageSender.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 azure_queue.sendtoAzure.send(String message) in C:\Users\keer\Source\Repos\azure_queue\azure_queue\Program.cs:line 30
at azure_queue.Program.Main(String[] args) in C:\Users\keer\Source\Repos\azure_queue\azure_queue\Program.cs:line 45
Message: 40400: Endpoint not found., Resource:sb://x-shared.servicebus.windows.net/x%20-%20test. TrackingId:fd30b288-cc6a-4360-9922-0b044e9de8f4_G28, SystemTracker:x-shared.servicebus.windows.net:x%20-%20test, Timestamp:6/28/2018 1:57:25 PM
HelpLink:
Source: Microsoft.ServiceBus
InnerExeption: System.ServiceModel.FaultException: 40400: Endpoint not found., Resource:sb://x-shared.servicebus.windows.net/x%20-%20test. TrackingId:fd30b288-cc6a-4360-9922-0b044e9de8f4_G28, SystemTracker:x-shared.servicebus.windows.net:x%20-%20test, Timestamp:6/28/2018 1:57:25 PM
at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.ThrowIfFaultMessage(Message wcfMessage)
at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.HandleMessageReceived(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<>c.<GetAsyncSteps>b__9_3(RequestAsyncResult thisPtr, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.RedirectBindingElement.RedirectContainerChannelFactory`1.RedirectContainerSessionChannel.RequestAsyncResult.<>c__DisplayClass8_1.<GetAsyncSteps>b__4(RequestAsyncResult thisPtr, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
at Microsoft.ServiceBus.Messaging.Sbmp.RedirectBindingElement.RedirectContainerChannelFactory`1.RedirectContainerSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<>c.<GetAsyncSteps>b__9_3(RequestAsyncResult thisPtr, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.SbmpTransactionalAsyncResult`1.<>c.<GetAsyncSteps>b__18_3(TIteratorAsyncResult thisPtr, IAsyncResult a)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result)
我能够使用您的 sendAsync() 方法实现成功发送代理消息。
此外,当队列不存在(例如 taskqueue1)时,我能够重现您问题中所述的相同错误。
Message: 40400: Endpoint not found., Resource:sb://{valid service bus namespace}.servicebus.windows.net/taskqueue1. TrackingId:7ce43d17-d339-4ded-b3be-71364a64f685_G17, SystemTracker:{valid service bus namespace}.servicebus.windows.net:taskqueue1, Timestamp:7/1/2018 1:23:04 AM...
从您发布的异常中提取的端点中的队列名称 x%20-%20test 似乎无效,因为有空格(例如 %20)。
sb://x-shared.servicebus.windows.net/x%20-%20test
So, please double check that the Azure Service Bus queue name is correct/valid and that it does exit.
此外,您使用的 Azure 服务总线 FQDN可能是正确的。否则,将抛出以下异常,而不是您问题中描述的异常:
Microsoft.ServiceBus.Messaging.MessagingCommunicationException: The remote name could not be resolved: '{nonexistent service bus namespace}.servicebus.windows.net'...
可以将消息发送到 Azure 服务总线队列,如下所示
namespace ServiceBus_Queue
{
class Program
{
const string ServiceBusConnectionString = "";
const string QueueName = "";
static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
var queueClient = QueueClient.CreateFromConnectionString(ServiceBusConnectionString, QueueName);
string Message = "I'm in Azure Service Bus Queue";
BrokeredMessage message = new BrokeredMessage(Message);
await queueClient.SendAsync(message);
}
}
}