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