Как эффективно передавать данные HTTP GET в HTTP PUT в .NET? - PullRequest
1 голос
/ 10 июня 2019

Я хотел бы асинхронно загрузить данные и затем загрузить их снова, используя .NET.В идеале это должно работать в .NET и .NET Core, так как в конце концов мне нужно использовать это в PowerShell 5 и 6.

Я искал некоторое время, но не смог найти хороший пример, но нескольконамекает, что PushStreamContent может быть правильным способом.К сожалению, PushStreamContent доступен только через ASP.NET, и я не нашел способа использовать его с ASP.NET Core, но мне удалось скопировать соответствующие части из GitHub и заставить его работать без внешних зависимостей в программе .NET Core.

Вот как я закончил, используя пример C # с .NET Core 2.2 ( см. Эту скрипту для полного кода ):

private async Task pipeGetToPut()
{
    System.Net.Http.HttpClient downloadHttpClient = new System.Net.Http.HttpClient();
    System.Net.Http.HttpRequestMessage getRequest = 
        new System.Net.Http.HttpRequestMessage(
            System.Net.Http.HttpMethod.Get, 
            new System.Uri(downloadUri));
    System.Net.Http.HttpResponseMessage getResponseMessage = 
        await downloadHttpClient.SendAsync(
            getRequest, 
            System.Net.Http.HttpCompletionOption.ResponseHeadersRead);
    getResponseMessage.EnsureSuccessStatusCode();

    System.Net.Http.HttpClient uploadHttpClient = new System.Net.Http.HttpClient();
    HttpRequestMessage putRequest = 
        new HttpRequestMessage(HttpMethod.Put, new System.Uri(uploadUri));
    putRequest.Content = 
        new PushStreamContent(async (stream, httpContent, transportContext) =>
        {
            Task copyTask = getResponseMessage.Content.CopyToAsync(stream);
            await copyTask;
            stream.Dispose();
        });
    putRequest.Content.Headers.ContentLength = 
        getResponseMessage.Content.Headers.ContentLength;
    uploadHttpClient.Timeout = 
        new TimeSpan(
            0, 
            0, 
            Math.Max(
              (Int32)(getResponseMessage.Content.Headers.ContentLength / (60 * 1024)), 
              (Int32)60));

    System.Net.Http.HttpResponseMessage putResponseMessage = 
        await uploadHttpClient.SendAsync(putRequest);
    putResponseMessage.EnsureSuccessStatusCode();
}
  • Is PushStreamContentправильный путь?
  • Есть ли лучший способ передать поток HTTP GET в поток HTTP PUT?
...