Bytearray SqlFileStream:在HTTP响应中返回流与字节数组

Bytearray SqlFileStream:在HTTP响应中返回流与字节数组,bytearray,asp.net-web-api2,asp.net-web-api,httpresponse,filestream,Bytearray,Asp.net Web Api2,Asp.net Web Api,Httpresponse,Filestream,对于使用.NETWebAPI在HTTP响应中返回字节数组与返回流的问题,我有点困惑 我遇到了以下代码: SqlConnection conn = new SqlConnection(); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "Select FileData.PathName() As FilePath, GET_FILESTREAM_TRANSACTION_CONTEXT

对于使用.NETWebAPI在HTTP响应中返回字节数组与返回流的问题,我有点困惑

我遇到了以下代码:

        SqlConnection conn = new SqlConnection();
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "Select FileData.PathName() As FilePath, GET_FILESTREAM_TRANSACTION_CONTEXT() AS Context From FileStorage";
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        reader.Read();
        string filePath = (string)reader["FilePath"];

        byte[] fileBytes = (byte[])reader["Context"];
        SqlFileStream stream = new SqlFileStream(filePath, fileBytes, FileAccess.Read);

        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
问题1: 为什么它们在HTTP响应中返回流而不是字节数组

问题2:
如果通过调用
(byte[])reader[“Context”]
,字节数组已经可用,为什么要创建SqlFileStream来读取数据?这难道不意味着整个文件内容都被读入内存吗?那么为什么需要流呢?

缓冲是返回流内容的主要原因。在ASP.NET Web API中,每次返回StreamContent时,您的响应都不会被缓冲,但字节数组响应已经被缓冲,可以提供服务。在字节[]的情况下,可以直接从字节[]设置HttpResponseMessage的内容,而无需将其转换为流类型。 此外,考虑在您希望连续地向客户端发送二进制内容的情况下使用PurSurrent内容,这样客户端可以在数据到达时类似于下面的代码片断:逐步地消耗API:

        var httpResponseMessage = new HttpResponseMessage
        {
            Content = new PushStreamContent(async (respStream, content, context) =>
            {
                using (var writer = new StreamWriter(respStream))
                {
                    await writer.WriteLineAsync();
                    await writer.FlushAsync();
                }
            }, "text/plain")
        };
问题1:为什么在HTTP响应中返回流而不是字节数组

因为字节数组可能很大,所以如果将整个数组读取到服务器的内存中,并将其保存在内存中,直到将其全部传输到客户端,则会给服务器带来巨大的内存负担。这就是拒绝服务攻击的组成部分。通过使用流,您可以让服务器根据需要以小块的形式加载数据,并在任何给定时间仅在内存中保留小块,同时等待数据传输

问题2:如果通过调用(byte[])reader[“Context”],字节数组已经可用,为什么要创建SqlFileStream来读取数据?这难道不意味着整个文件内容都被读入内存吗?那么为什么需要一条流呢

您看到的字节数组不是实际的文件内容。如果您看一下,也可以看一下,这个字节数组是某种“事务上下文”,这是数据库服务器从存储中读取实际数据所必需的(一种可怕的攻击)。实际数据可能非常庞大,因此您发布的代码会执行所有这些操作,以避免将其全部加载到内存中