我在数据库中有多个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方法都已被调用。
我很感兴趣,因为如果我需要发送较大的有效载荷,那么我想使用一种不会在客户端消耗大量资源的方法。