#c# #file-upload #httpclient
#c# #загрузка файла #httpclient
Вопрос:
Я пытаюсь повторно загрузить некоторые файлы. И для этого я получаю поток загрузки и оборачиваю его StreamContent . Затем пытается загрузить этот поток. Но я всегда получаю SocketException
. Я что-то здесь упускаю? Возможно ли вообще перенаправить поток в другое место?
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.ConnectionClose = false;
var stream = await _httpClient.GetStreamAsync(fileDownloadInfo.Url);
var streamContent = new StreamContent(stream);
var response = await _httpClient.PutAsync(fileUploadUrl, streamContent); // throws excepiton
Вот полное сообщение об исключении:
"InnerException": {
"ClassName": "System.IO.IOException",
"Message": "Unable to read data from the transport connection: An established connection was aborted by the software in your host machine..",
"Data": null,
"InnerException": {
"ClassName": "System.Net.Sockets.SocketException",
"Message": "An established connection was aborted by the software in your host machine.",
"Data": null,
"InnerException": null,
"HelpURL": null,
"StackTraceString": null,
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"ExceptionMethod": null,
"HResult": -2147467259,
"Source": null,
"WatsonBuckets": null,
"NativeErrorCode": 10053
},
"HelpURL": null,
"StackTraceString": " at System.Net.Security.SslStream.<WriteSingleChunk>g__CompleteAsync|210_1[TWriteAdapter](ValueTask writeTask, Byte[] bufferToReturn)rn at System.Net.Security.SslStream.WriteAsyncInternal[TWriteAdapter](TWriteAdapter writeAdapter, ReadOnlyMemory`1 buffer)rn at System.Net.Http.HttpConnection.WriteAsync(ReadOnlyMemory`1 source)rn at System.Net.Http.HttpConnection.ChunkedEncodingWriteStream.<WriteAsync>g__WriteChunkAsync|2_0(HttpConnection connection, ReadOnlyMemory`1 buffer)rn at System.Net.Http.HttpConnection.CopyFromBufferAsync(Stream destination, Int32 count, CancellationToken cancellationToken)rn at System.Net.Http.HttpConnection.CopyToContentLengthAsync(Stream destination, UInt64 length, Int32 bufferSize, CancellationToken cancellationToken)rn at System.Net.Http.HttpConnection.ContentLengthReadStream.CompleteCopyToAsync(Task copyTask, CancellationToken cancellationToken)rn at System.Net.Http.StreamToStreamCopy.<CopyAsync>g__DisposeSourceAsync|0_0(Task copyTask, Stream source)rn at System.Net.Http.HttpContent.CopyToAsyncCore(ValueTask copyTask)",
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"ExceptionMethod": null,
"HResult": -2146232800,
"Source": "System.Private.CoreLib",
"WatsonBuckets": null
},
Комментарии:
1. Я не уверен, можете ли вы передать поток загрузки из вашего
GetStreamAsync(...)
непосредственно в загрузкуPostAsync(...)
. Просто для отладки, что произойдет, если вы загрузите stream в memorystream (или сохраните его на диске), чтобы вы могли установить точку останова и проверить ее содержимое?2. @mortb Я могу загрузить его в FilleStream, а затем загрузить файл без проблем. Мне было интересно, могу ли я просто «обойти» поток, тогда мне не придется беспокоиться об удалении файла или очистке памяти.
3. Попробуйте с
MemoryStream
помощью, тогда вы будете кэшировать файл только в памяти. Как я уже сказал, я не уверен, возможно ли напрямую передавать поток загрузки в upload