Как файл читается при отправке в конечную точку API - PullRequest
0 голосов
/ 14 февраля 2019

Вопрос. Я хочу знать, как читается файл, если он отправлен в конечную точку.

После прочтения нескольких статей и проведения некоторых исследований я могу отправить файл в корзину Amazon S3.Ниже working code, но я не понимаю, как файл отправляется в мой API через Postman и как происходит обработка, как этот файл читается в коде.Может кто-нибудь, пожалуйста, помогите мне расшифровать этот код.

Я добавил номера строк в код, который хочу понять.

Line Number

1 [httppost]
2 public async Task<bool> Upload()
  {
    try
    {
3       var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();
4       foreach (var content in filesReadToProvider.Contents)
        {
5           var stream = await content.ReadAsStreamAsync();
6           using (StreamReader sr = new StreamReader(stream))
            {
                string line = "";
7               while ((line = sr.ReadLine()) != null)
                {
8                   using (MemoryStream outputStream = new MemoryStream())
9                   using (StreamWriter sw = new StreamWriter(outputStream))
                    {
                        sw.WriteLine(line);
10                      sw.Flush();
                        PutRecordRequest putRecord = new PutRecordRequest();
                        putRecord.DeliveryStreamName = myStreamName;
                        Record record = new Record();
11                      outputStream.Position = 0;
                        record.Data = outputStream;
                        putRecord.Record = record;
                        try
                        {
                            await kinesisClient.PutRecordAsync(putRecord);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Failed to send record to Kinesis. Exception: {0}", ex.Message);
                        }
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
    }

    return true;
  }

PS: Я отправляю файл через Почтальон для проверки работы этой конечной точки.

Мое обязательство по приведенному выше коду.

Line Number 1: Это запрос HTTPPOST, так что это означает, чтосодержимое, которое я отправляю, будет в теле запроса, а не в заголовках или URL.Поскольку я отправляю файл, содержимое файла будет отправлено в теле запроса.

Line Number 2: asyn, поэтому он будет запущен в отдельном потоке, поэтому мой пользовательский интерфейс (если есть) будет отзывчивым.

Line Number 3: Я предполагаю, что Запрос - это, в основном, дескриптор для чтения содержимого тела для любых запросов API, поэтому я читаю содержимое, используя Request.Content,
Вопрос: Чтоэто значение ReadAsMultipartAsync: оно говорит: Reads all body parts within a MIME multipart message and produces a set of System.Net.Http.HttpContent instances as a result.?Что это значит?Означает ли это, что если мой файл содержит 10 строк, он читает все 10 строк и хранит их в памяти (в терминах непрофессионала)?

Line Number 4: Я предполагаю, что filesReadToProvider.Contents снова дескриптордля всех тех 10 строк, которые у меня есть в файле.Означает ли это, что если в моем файле 10 строк , цикл будет выполняться 10 раз ( Я думаю, что я не прав ).

Line Number 5: ReadAsStreamAsync там написано: Serialize the HTTP content and return a stream that represents the content as an asynchronous operation..Значит ли это, что он читает по 1 строке за раз и сериализует ее?Но почему он сериализует строки?

LineNumber 6: Поскольку я имею дело с потоками, я создаю экземпляр потокового ридера и передаю ему поток.(в терминах непрофессионала: я передаю одну строку файла, которую читаю)?

Помимо этого я потерян.Я полностью запутался после этого.Что такое поток?Это одна строка в моем файле?

Вопрос: Пожалуйста, кто-нибудь, помогите мне понять, что происходит в приведенном выше коде.Я не думаю, что могу напрямую связать строку файла с потоком .Пожалуйста, ведите меня.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Строка 1: настройка метода для ответа на HttpPost

Строка 2: асинхронность означает отключение и выполнение задачи (которая может быть в отдельном потоке и будет в этом случае), и повторный вызовэтот метод, когда эта задача завершена или не выполнена.

Строка 3: многокомпонентный HTTP - это стандарт, часто используемый для отправки файлов Что такое http multipart request?

Строка 4:Это различное содержание многочастного запроса, отправленного пользователем.

Строка 5: получить содержимое этой части в виде потока.Поток выполняет только чтение байтов и не очень удобен для пользователя.Следовательно, StreamReader в Строке 6.

Строка 6: Создает StreamReader, который является вспомогательным классом, позволяющим построчную обработку потока.

Строка 7: выполнение цикла, получение строкикак строка, пока мы не достигнем нуля.

Строка 8: Построить поток памяти.Поток памяти - это поток, в котором операции чтения / записи выполняются в памяти, а не в сети или на диске.

Строка 9: используйте StreamWriter вокруг потока памяти.StreamWriter - это вспомогательный класс, который позволяет упростить операции со строками.

Строка 10: Используйте StreamWriter для записи текущих строк из цикла, начатого в строке 7. Мы очищаем его, чтобы в нем была полная строкаЭто.Если мы не сделаем этого потенциально, у него не будет всего контента.Потоки по умолчанию будут буферизоваться, то есть они будут задерживать чтение / запись до тех пор, пока к ним не будет добавлено достаточно данных для оптимизации производительности.Это заставляет эту операцию чтения / записи.

Строка 11: Если мы не установим местоположение MemoryStream обратно в 0, оно будет пытаться прочитать ПОСЛЕ строки, которая была вставлена.Это возвращает его к началу строки.MemoryStream - это в основном байтовый буфер с тем, что вы помещаете в него, вместе с текущей информацией о местоположении для чтения / записи.

0 голосов
/ 14 февраля 2019

Поток - это поток данных, вы можете иметь много разных типов.StreamReader прочитает файл, и ему нужен поток для чтения.Вы не передаете строку из файла, вы в основном открываете файл и асинхронно считываете его содержимое в поток.Люди иногда используют такие потоки, когда фактические данные слишком велики для одновременного считывания в память перед их записью.

Этот код использует поток памяти для буферизации информации, которую он читает из файла, и KinesisClient для его записи.Я не очень знаком с KinesisClient, но, учитывая, что вы говорите, что код работает, я бы сказал, что он изящно обрабатывает анализ потока, который передается для записи информации.

...