C # Загрузка файла и загрузка того же файла, что и stream, вызывает исключение SocketException

#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