【问题标题】:How a file is read when sent to an API end point发送到 API 端点时如何读取文件
【发布时间】:2019-02-14 07:25:57
【问题描述】:

问题:我想知道一个文件如果被发送到一个端点是如何被读取的。

阅读多篇文章并进行一些研究后,我能够将文件发送到 Amazon S3 存储桶。下面是working code,但我不明白文件是如何通过邮递员发送到我的 API 的,以及处理是如何发生的,这个文件是如何在代码中读取的。有人可以帮我解码这段代码吗?

我在想要理解的代码中添加了行号。

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;
  }

P.S:我正在通过 Postman 发送一个文件来测试这个端点的工作情况。

我对上述代码的理解。

Line Number 1: 这是一个 HTTPPOST 请求,这意味着我发送的内容将在请求的正文中,而不是在标头或 URL 中。由于我是发送文件,所以文件内容会在请求体中发送。

Line Number 2: asyn 所以它将在单独的线程上运行,这样我的 UI(如果有的话)就会响应。

Line Number 3: 我猜 Request 基本上是读取任何 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: 因为我有要处理的流,所以我正在创建一个流读取器实例并将流传递给它。 (通俗地说:我正在传递我正在阅读的一行文件)?

除此之外,我迷路了。在这之后我完全糊涂了。什么是流?这是我文件中的一行吗?

问题:请有人帮助我了解上述代码中发生的情况。我认为我不能直接将 文件行与流链接。请指导我。

【问题讨论】:

    标签: c# .net file asp.net-web-api asp.net-web-api2


    【解决方案1】:

    第 1 行:设置响应 HttpPost 的方法

    第 2 行:async 表示关闭并执行任务(可以在单独的线程上,在这种情况下将是),并在该任务完成或失败时重新调用此方法。

    第 3 行:Multipart HTTP 是一种常用于发送文件的标准What is http multipart request?

    第 4 行:这是用户发送的 Multipart 请求的不同内容。

    第 5 行:将这部分的内容作为流获取。流只执行字节读取,对用户不是很友好。因此第 6 行中的 StreamReader。

    第 6 行:创建一个 StreamReader,它是一个帮助类,允许逐行处理 Stream。

    第 7 行:循环,将行作为字符串,直到我们遇到空值。

    第 8 行:构造内存流。内存流是在内存中执行读/写操作而不是从网络或磁盘执行的流。

    第 9 行:在内存流周围使用 StreamWriter。 StreamWriter 是一个帮助类,可以更轻松地进行基于行的操作。

    第 10 行:使用 StreamWriter 从第 7 行开始的循环中写入当前行。我们刷新它,使其内部包含完整的行。如果我们不这样做,它就不会拥有所有的内容。默认情况下,流将缓冲,这意味着它们将延迟读取/写入,直到将足够的数据添加到它们作为性能优化。这会强制进行读/写操作。

    第 11 行:如果我们不将 MemoryStream 的位置设置回 0,它将在插入该行后尝试读取。这会将其设置回行首。 MemoryStream 基本上是一个字节缓冲区,其中包含您放入其中的内容以及当前的读/写位置信息。

    【讨论】:

    • 很好的答案。还想指出,在第 6 行、第 8 行和第 9 行,“使用”语句确保声明的资源(在本例中为 StreamReader srMemoryStream outputStreamStreamWriter sw,将在离开范围 @987654326 时被释放@.Check here
    【解决方案2】:

    流是一种数据流,可以有许多不同的类型。 StreamReader 将读取文件,它需要一个流来读取它。您没有从文件中传递一行,您基本上是在打开一个文件并将其内容异步读取到流中。当实际数据太大而无法在写出之前一次全部读入内存时,人们有时会使用这样的流。

    此代码使用内存流来缓冲从文件中读取的信息,并使用 KinesisClient 将其写出。我对 KinesisClient 不是很熟悉,但鉴于您说代码有效,我会说它可以优雅地处理解析它正在传递的流以写出信息。

    【讨论】:

    • 我需要逐行解释。另外,我不想知道 Kinesis 的东西。
    • Glenn Watson 似乎已经逐行分解了。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多