Я хотел бы асинхронно загрузить данные и затем загрузить их снова, используя .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?