C# 无法访问C中的Amazon SQS消息属性#

C# 无法访问C中的Amazon SQS消息属性#,c#,amazon-web-services,amazon-sqs,C#,Amazon Web Services,Amazon Sqs,我有一个创建SQS消息并将它们放在SQS队列中的进程,还有一个读取这些消息并根据消息体的内容和属性执行某些逻辑的进程 我可以成功地在SQS队列上创建一条包含正文和属性的消息,但在回读消息属性时遇到问题 我确信我的消息创建过程是正确的,我可以在AWS SQS控制台中看到队列的属性。我就是不明白为什么我不能读回这些属性 创建邮件的我的代码: IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient(); var sendMessageReques

我有一个创建SQS消息并将它们放在SQS队列中的进程,还有一个读取这些消息并根据消息体的内容和属性执行某些逻辑的进程

我可以成功地在SQS队列上创建一条包含正文和属性的消息,但在回读消息属性时遇到问题

我确信我的消息创建过程是正确的,我可以在AWS SQS控制台中看到队列的属性。我就是不明白为什么我不能读回这些属性

创建邮件的我的代码:

IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient();
var sendMessageRequest = new SendMessageRequest();
sendMessageRequest.QueueUrl = "myURL";
Dictionary<string, MessageAttributeValue> MessageAttributes = new Dictionary<string, MessageAttributeValue>();
MessageAttributeValue messageTypeAttribute = new MessageAttributeValue();
messageTypeAttribute.DataType = "String";
messageTypeAttribute.StringValue = "HIGH";
MessageAttributes.Add("MESSAGEPRIORITY", messageTypeAttribute);

sendMessageRequest.MessageAttributes = MessageAttributes;
sendMessageRequest.MessageBody = "Thats the message body";

sqs.SendMessage(sendMessageRequest);
IAmazonSQS sqs=AWSClientFactory.CreateAmazonSQSClient();
var sendMessageRequest=new sendMessageRequest();
sendMessageRequest.QueueUrl=“myURL”;
Dictionary MessageAttributes=new Dictionary();
MessageAttributeValue messageTypeAttribute=新的MessageAttributeValue();
messageTypeAttribute.DataType=“String”;
messageTypeAttribute.StringValue=“高”;
添加(“MESSAGEPRIORITY”,messageTypeAttribute);
sendMessageRequest.MessageAttributes=MessageAttributes;
sendMessageRequest.MessageBody=“这是消息正文”;
sqs.SendMessage(sendMessageRequest);
上述操作正常,并创建了一条属性为MESSAGEPRIORITY=HIGH的消息(我可以在SQS控制台中看到消息和属性)

读回消息时(我跳过了显示队列URL等的部分代码):

IAmazonSQS sqs=AWSClientFactory.CreateAmazonSQSClient();
ReceiveMessageResponse receiveMessage=新的ReceiveMessageResponse();
ReceiveMessageRequest=新的ReceiveMessageRequest();
request.QueueUrl=“myURL”;
receiveMessage=sqs.receiveMessage(请求);
字符串messageBody=receiveMessage.Messages[0].Body;
Dictionary messageAttributes=receiveMessage.Messages[0]。messageAttributes;
通过上面的代码,我得到了消息的主体,但是属性是空的! 当直接使用SQS队列手动创建消息时,我也遇到同样的问题。 我不明白为什么? 任何帮助都会很好。
非常感谢,

好的,所以我想出了这个。 在调用提取消息之前,需要将属性名称指定为ReceiveMessageRequest对象的属性

因此,上述代码需要更改为:

IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient();
ReceiveMessageResponse receiveMessage = new ReceiveMessageResponse();
ReceiveMessageRequest request = new ReceiveMessageRequest();

//Specify attribute list
List<string> AttributesList = new List<string>();
AttributesList.Add("MESSAGEPRIORITY");

//Assign list and QueueURL to request
request.MessageAttributeNames = AttributesList;
request.QueueUrl = "myURL";

//Receive the message...
receiveMessage = sqs.ReceiveMessage(request);
//Body...
string messageBody = receiveMessage.Messages[0].Body;
//...and attributes
Dictionary<string, MessageAttributeValue> messageAttributes = receiveMessage.Messages[0].MessageAttributes;
IAmazonSQS sqs=AWSClientFactory.CreateAmazonSQSClient();
ReceiveMessageResponse receiveMessage=新的ReceiveMessageResponse();
ReceiveMessageRequest=新的ReceiveMessageRequest();
//指定属性列表
列表属性列表=新列表();
AttributesList.Add(“MESSAGEPRIORITY”);
//为请求分配列表和队列URL
request.MessageAttributeNames=AttributesList;
request.QueueUrl=“myURL”;
//收到消息。。。
receiveMessage=sqs.receiveMessage(请求);
//身体。。。
字符串messageBody=receiveMessage.Messages[0].Body;
//…和属性
Dictionary messageAttributes=receiveMessage.Messages[0]。messageAttributes;

以上对我来说很有用。希望它对某些人有用……

检索消息的所有属性而不指定每个属性,您可以将“*”或“全部”放在属性列表中。像这样:

//Specify attribute list
List<string> AttributesList = new List<string>();
AttributesList.Add("*");
//指定属性列表
列表属性列表=新列表();
AttributesList.Add(“*”);

从SQS读取数据的完整方法

    public async Task ReadFromSQS()
    {
        IAmazonSQS sqs = new AmazonSQSClient(RegionEndpoint.EUWest1);
        try
        {
            List<string> AttributesList = new List<string>();
            AttributesList.Add("NameOfTheAttribute");

            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
            receiveMessageRequest.QueueUrl = IdQueue;
            receiveMessageRequest.MessageAttributeNames = AttributesList;
            ReceiveMessageResponse receiveMessageResponse = await sqs.ReceiveMessageAsync(receiveMessageRequest);

            foreach (Message message in receiveMessageResponse.Messages)
            {
                Debug.WriteLine("Body: "+ message.Body);
                Debug.WriteLine("Values: " + message.MessageAttributes.Count);
                foreach (var entry in message.MessageAttributes)
                {
                    Debug.WriteLine("Attribute");
                    Debug.WriteLine("Name: "+ entry.Key);
                    Debug.WriteLine("Value1: "+ entry.Value.StringValue);
                }
            }
            String messageRecieptHandle = receiveMessageResponse.Messages[0].ReceiptHandle;
            //Deleting a message
            Debug.WriteLine("Deleting the message.\n");
            DeleteMessageRequest deleteRequest = new DeleteMessageRequest();
            deleteRequest.QueueUrl = IdQueue;
            deleteRequest.ReceiptHandle = messageRecieptHandle;
            await sqs.DeleteMessageAsync(deleteRequest);
        }
        catch (AmazonSQSException ex)
        {
            Debug.WriteLine("Caught Exception: " + ex.Message);
            Debug.WriteLine("Response Status Code: " + ex.StatusCode);
            Debug.WriteLine("Error Code: " + ex.ErrorCode);
            Debug.WriteLine("Error Type: " + ex.ErrorType);
            Debug.WriteLine("Request ID: " + ex.RequestId);
        }

        Debug.WriteLine("Press Enter to continue...");
        Console.Read();
    }
public异步任务ReadFromSQS()
{
IAmazonSQS sqs=新AmazonSQSClient(RegionEndpoint.EUWest1);
尝试
{
列表属性列表=新列表();
属性列表。添加(“属性名称”);
ReceiveMessageRequest ReceiveMessageRequest=新的ReceiveMessageRequest();
receiveMessageRequest.QueueUrl=IdQueue;
receiveMessageRequest.MessageAttributeNames=AttributesList;
ReceiveMessageResponse ReceiveMessageResponse=等待sqs.ReceiveMessageAsync(receiveMessageRequest);
foreach(receiveMessageResponse.Messages中的消息)
{
Debug.WriteLine(“Body:+message.Body”);
Debug.WriteLine(“值:”+message.MessageAttributes.Count);
foreach(message.MessageAttributes中的var条目)
{
Debug.WriteLine(“属性”);
Debug.WriteLine(“名称:”+entry.Key);
Debug.WriteLine(“Value1:+entry.Value.StringValue”);
}
}
字符串MessageReceiptHandle=receiveMessageResponse.Messages[0]。ReceiptHandle;
//删除邮件
Debug.WriteLine(“删除消息。\n”);
DeleteMessageRequest deleteRequest=新的DeleteMessageRequest();
deleteRequest.QueueUrl=IdQueue;
deleteRequest.ReceiptHandle=MessageReceiptHandle;
等待sqs.DeleteMessageAsync(deleteRequest);
}
捕获(amazonsqsex异常)
{
Debug.WriteLine(“捕获的异常:+ex.Message”);
Debug.WriteLine(“响应状态代码:”+ex.StatusCode);
Debug.WriteLine(“错误代码:”+ex.ErrorCode);
Debug.WriteLine(“错误类型:”+ex.ErrorType);
Debug.WriteLine(“请求ID:+ex.RequestId”);
}
Debug.WriteLine(“按Enter键继续…”);
Console.Read();
}

很好,我花了一段时间认为属性设置不正确。通过内联执行MessageAttributeNames列表,您可以简化一些事情
request.MessageAttributeNames=new List(){“MESSAGEPRIORITY”}更简洁。我们可以按消息属性筛选队列中的消息吗?
    public async Task ReadFromSQS()
    {
        IAmazonSQS sqs = new AmazonSQSClient(RegionEndpoint.EUWest1);
        try
        {
            List<string> AttributesList = new List<string>();
            AttributesList.Add("NameOfTheAttribute");

            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
            receiveMessageRequest.QueueUrl = IdQueue;
            receiveMessageRequest.MessageAttributeNames = AttributesList;
            ReceiveMessageResponse receiveMessageResponse = await sqs.ReceiveMessageAsync(receiveMessageRequest);

            foreach (Message message in receiveMessageResponse.Messages)
            {
                Debug.WriteLine("Body: "+ message.Body);
                Debug.WriteLine("Values: " + message.MessageAttributes.Count);
                foreach (var entry in message.MessageAttributes)
                {
                    Debug.WriteLine("Attribute");
                    Debug.WriteLine("Name: "+ entry.Key);
                    Debug.WriteLine("Value1: "+ entry.Value.StringValue);
                }
            }
            String messageRecieptHandle = receiveMessageResponse.Messages[0].ReceiptHandle;
            //Deleting a message
            Debug.WriteLine("Deleting the message.\n");
            DeleteMessageRequest deleteRequest = new DeleteMessageRequest();
            deleteRequest.QueueUrl = IdQueue;
            deleteRequest.ReceiptHandle = messageRecieptHandle;
            await sqs.DeleteMessageAsync(deleteRequest);
        }
        catch (AmazonSQSException ex)
        {
            Debug.WriteLine("Caught Exception: " + ex.Message);
            Debug.WriteLine("Response Status Code: " + ex.StatusCode);
            Debug.WriteLine("Error Code: " + ex.ErrorCode);
            Debug.WriteLine("Error Type: " + ex.ErrorType);
            Debug.WriteLine("Request ID: " + ex.RequestId);
        }

        Debug.WriteLine("Press Enter to continue...");
        Console.Read();
    }