代码之家  ›  专栏  ›  技术社区  ›  SidC

如何将SQS消息体解析为JSON?

  •  0
  • SidC  · 技术社区  · 6 年前

    我正在构建一个.NETCore2.2Web应用程序,它使用SQS从队列中获取信息。我只想将特定元素发送到视图,而不是将整个消息输出发送到视图。我的理解是NewtonSoft.JSON可以将列表转换为JSON,但我不确定如何解析列表的某些部分。

    我的控制器逻辑如下:

    public async Task<IActionResult> Index()
        {
            //List<MessageModel> models = new List<MessageModel>();
            MessageModel model = new MessageModel();
            List<MessageModel> models = new List<MessageModel>();
            models = await ListTemplatesAsync(models);
    
            await StartEnvironmentAsync(models);
            return View(models);
        }
    
        private async Task<List<MessageModel>> ListTemplatesAsync(List<MessageModel> models)
        {
            var request = await GetEnvironments.GetAWSTemplatesAsync();
            var response = await GetEnvironments.OnMessageReceiptAsync();
            //models = new List<MessageModel>();
    
            foreach (var msg in response)
            {
                models.Add(new MessageModel(msg.MessageId, msg.Body, msg.MessageAttributes, msg.ReceiptHandle));
                string json = JsonConvert.SerializeObject(models, Formatting.None);
            }
    
            return models;
        }
    

    我通过以下方式获得MessageModel列表:

     try
            {
                AWSConfigs.LoggingConfig.LogMetrics = false;
                AWSConfigs.LoggingConfig.LogResponses = ResponseLoggingOption.OnError;
                AWSConfigs.LoggingConfig.LogTo = LoggingOptions.Console;
                AWSConfigs.LoggingConfig.LogMetricsFormat = LogMetricsFormatOption.Standard;
    
                IAmazonSQS client = options.CreateServiceClient<IAmazonSQS>();
                var request =  new ReceiveMessageRequest{};
    
                List<string> AttributesList = new List<string>
                {
                    "sourcemessageId",
                    "status",
                    "status_message"
                };
                request.MessageAttributeNames = AttributesList;
                request.QueueUrl = recvQueueUrl;
                request.MaxNumberOfMessages = 10;
    
                ReceiveMessageResponse response = await client.ReceiveMessageAsync(request);
    
                if (response.HttpStatusCode == HttpStatusCode.Accepted)
                {
                    Console.WriteLine("Read Response OK");
                }
                else
                {
                    Console.WriteLine("Read Response Failed");
                }
    
                string FoundHandle = null;
    
                var messages = response.Messages;
                var list = new List<Message>();
    
                messages.ForEach(delegate(Message m)
                {
                    Console.WriteLine("Read MessageId");
                    Console.WriteLine(m.MessageId);
                    Console.Write("Body");
                    Console.WriteLine(m.Body);
                    var curAttributes = m.MessageAttributes;
                    var allattrib = curAttributes.GetEnumerator();
    
    
                    while (allattrib.MoveNext())
                    {
                        var pair = allattrib.Current;
    
                        Console.Write(pair.Key);
                        Console.Write("=");
                        Console.WriteLine(pair.Value.StringValue);
                    }
    
                    FoundHandle = m.ReceiptHandle;
    
                });
                foreach (var message in messages)
                {
                    list.Add(message);
                }
    
                string json = JsonConvert.SerializeObject(list, Formatting.Indented);
                return list;
            }
            catch(AmazonSQSException ex)
            {
                Console.WriteLine(ex.Message);
                throw new AmazonSQSException(ex.Message);
            }
    

    答复正文部分如下:

    Message Body
    {"Templates": [{"TemplateID": "1", "TemplateName": "Metasploitable3", 
     "TemplateDesc": "Vulnerable Windows 2008 R2 Distribution"},
    

    @model IEnumerable<MessageModel>;
        }
    <table>
      <thead>
        <tr>
         <th>
           @Html.DisplayNameFor(model => model.Message)
         </th>
         <th>
           @Html.DisplayNameFor(model => model.Body)
         </th>
        </tr>
      </thead>
     <tbody>
        @foreach (var item in Model)
        {
           <tr>
             <td>@Html.DisplayFor(modelItem => item.Message)</td>
             <td>@Html.DisplayFor(modelItem => item.Body)</td>
           </tr>
        }
     </tbody>
    

    如何将我的列表转换成JSON,以便从上面的消息体中获得模板名称和描述段?存储在数据库表中并让控制器通过ModelMessage类提取表内容是最佳做法吗?当前类仅在内存中,不会将消息响应写入物理数据库表。

    0 回复  |  直到 6 年前