HttpClient流式传输多部分内容,大型负载

时间:2019-09-20 19:48:33

标签: .net stream streaming httpclient dotnet-httpclient

我在数据库中有多个Blob,需要将其发布到Rest服务。

我想避免将内容加载到内存中,因为斑点可能很多和/或很大。

我的想法是创建一个MultipartFormDataContent实例,并向其中添加StreamContent实例,其中StreamContents流将是来自数据库的流。

我这样查询SQL Server数据库:

using (SqlCommand cmd = new SqlCommand("pGetData", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@RecordID", attachmentID);

    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        if (reader.Read())
        {
            int iColumnIndex = reader.GetOrdinal("Data");                          
            var MyStream = new MyStream(reader.GetStream(iColumnIndex));
        }
    }
}

我这样创建我的休息请求:

MultipartFormDataContent content = new MultipartFormDataContent();
foreach (int id in listofids)
{
    StreamContent partData = new StreamContent(GetData(id));  

    content.Add(partData , $"Data_{id}",$"Data{id}.dat");

    HttpClient c = new HttpClient();
    string sAPIUrl = State.ConfigurationState.DocumentLibraryAPIUrl;
    HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Post, sAPIUrl);
    msg.Content = content;

    HttpResponseMessage response = c.SendAsync(msg).Result;
}

//this wrapper class is just for testing purposes, because
//I want to put a breakpoint on the read method so I know when the stream is  
//actually being read
public class MyStream : Stream
{
    Stream source_m;

    public MyStream(Stream source)
    {
        source_m = source;
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return source_m.Read(buffer,offset,count);
    }
}

我的问题是,HttpClient将在发出请求之前组装整个请求(将每个部分流中的数据复制到内存或磁盘中),还是在发送请求时一一读取每个部分流? / p>

我问,因为作为测试,我有两个Visual Studio实例在运行,一个实例运行一个项目,该项目是一个调用rest服务的客户端,从数据库中流数据并使用HttpClient创建rest调用。

另一个Visual Studio实例运行Rest服务。

我认为可能发生的情况是,在发出ReSt请求时将调用read方法,并且我将看到一个读取,然后其余api将接收该请求,然后进行更多读取,直到发出整个请求为止。相反,我发现,在Rest api收到指示整个Http请求已在客户端上缓冲的请求之前,每个部分流的read方法都已被调用。

我很感兴趣,因为如果我需要发送较大的有效载荷,那么我想使用一种不会在客户端消耗大量资源的方法。

0 个答案:

没有答案