HttpClient потоковое многокомпонентное содержимое, большие полезные нагрузки - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть несколько больших двоичных объектов в базе данных, которые мне нужно опубликовать в службе отдыха.

Я хочу избежать загрузки вещей в память, так как большие двоичные объекты могут быть многочисленными и / или большими.

Моя идея состоит в том, чтобы создать экземпляр MultipartFormDataContent и добавить к нему экземпляры StreamContent, где StreamContents Stream будет потоками из базы данных.

Я запрашиваю базу данных 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 весь запрос перед его отправкой (копирование данных из каждого потока деталей в память или на диск),или он будет читать каждую часть потока по очереди при отправке запроса?

Я спрашиваю, потому что в качестве теста у меня запущены два экземпляра Visual Studio: один запускает проект, который является клиентом, вызывающим службу отдыха., передает данные из базы данных и создает вызов rest с помощью HttpClient.

Другой экземпляр Visual Studio запускает службу Rest.

Я мог бы подумать, что метод read будет вызываться при выполнении запроса ReSt, и я буду видеть чтение, затемостальные API получат запрос, а затем будут читать, пока не будет выполнен весь запрос.Вместо этого я обнаружил, что метод read для каждого потока частей вызывался до того, как API Rest когда-либо получал запрос, указывающий, что весь запрос Http был буферизован на клиенте.

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

...