浏览器 HTTP 客户端中现在默认启用流式 HTTP 响应。 因此,HttpContent.ReadAsStreamAsync 方法现在返回 BrowserHttpReadStream 而不是 MemoryStream,这不支持同步操作。 这可能需要更新依赖于同步流操作的现有代码。
引入的版本
.NET 10
以前的行为
以前,在 WebAssembly(WASM)和 Blazor 等浏览器环境中,HTTP 客户端默认缓冲了整个响应。
HttpContent 对象包含一个 MemoryStream,除非使用 WebAssemblyEnableStreamingResponse 选项明确选择了流式响应。
var response = await httpClient.GetAsync("https://example.com");
var contentStream = await response.Content.ReadAsStreamAsync(); // Returns MemoryStream
新行为
从 .NET 10 开始,默认情况下会启用流式处理 HTTP 响应。
HttpContent 不再包含 MemoryStream。 相反,HttpContent.ReadAsStreamAsync 返回 BrowserHttpReadStream,这不支持同步操作。
var response = await httpClient.GetAsync("https://example.com");
var contentStream = await response.Content.ReadAsStreamAsync(); // Returns BrowserHttpReadStream
破坏性变更的类型
这是行为 变化。
更改原因
此更改支持围绕流 GetFromJsonAsAsyncEnumerable 的用例。
建议的措施
如果应用程序依赖于同步流操作,请更新代码以使用异步替代方案。 要全局禁用流处理或针对特定请求禁用流处理,请使用提供的配置选项。
要禁用针对单个请求的流处理,请使用以下操作:
request.Options.Set(new HttpRequestOptionsKey<bool>("WebAssemblyEnableStreamingResponse"), false);
// or
request.SetBrowserResponseStreamingEnabled(false);
要全局禁用流式处理,请设置环境变量 DOTNET_WASM_ENABLE_STREAMING_RESPONSE 或将以下内容添加到项目文件中:
<WasmEnableStreamingResponse>false</WasmEnableStreamingResponse>
注释
截止 .NET 10 预览版 3,<WasmEnableStreamingResponse> 属性尚不可用。 它将在未来版本中可用。 有关更多详细信息,请参阅 GitHub 问题。