dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
14.96k stars 4.65k forks source link

Asynchronous ZipArchive stream methods still call synchronous methods of the underlying stream #107171

Open serggusak opened 2 weeks ago

serggusak commented 2 weeks ago

Description

Asynchronous ZipArchive stream methods still call synchronous methods of the underlying stream:

using (var zip = new ZipArchive(/new WriteOnlyStreamWrapper(/httpContext.Response.Body/)/, ZipArchiveMode.Create)) await using (Stream strm = zip.CreateEntry("response").Open()) { await strm.WriteAsync(bytes); // Synchronous operations are disallowed exception here }

If I debug using my wrapper, I can see that Flush is called on the stream instead of FlushAsync

Reproduction Steps

Write some code that creates a ZipArchive for writing around a stream that supports only asynchronous operations, creates an entry, open it and write some data to the stream asynchronously.

Expected behavior

The data has been successfully written

Actual behavior

Get "Synchronous operations are disallowed" exception because the framework calls a synchronous method (Flush)

Regression?

No response

Known Workarounds

No response

Configuration

.Net 8, Windows, x64

Other information

No response

dotnet-policy-service[bot] commented 2 weeks ago

Tagging subscribers to this area: @dotnet/area-system-io-compression See info in area-owners.md if you want to be subscribed.

ericstj commented 1 week ago

Triage: not a regression - could be considered for the future with a proposed design change.