Как проанализировать тело сообщения SQS в JSON? - PullRequest
0 голосов
/ 13 декабря 2018

Я создаю веб-приложение .NET Core 2.2, которое использует 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;
    }

Iполучаю список 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"},

Мое представление содержит пока простую структуру таблицы HTML в видеследует:

@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?Этот текущий класс находится только в памяти и не записывает ответы на сообщения в физическую таблицу базы данных.

...