.NET 8 Blazor中如何用GetFromJsonAsAsyncEnumerable传请求对象?
.NET 8 Blazor Web App 传递复杂请求对象到GetFromJsonAsAsyncEnumerable的实现方案
因为GetFromJsonAsAsyncEnumerable本身不直接支持带JSON体的GET请求,而你的场景又无法拆分请求参数到QueryString,这里提供一种基于HttpClient.SendAsync结合FastEndpoints配置的可行方案:
1. Blazor客户端实现
通过手动构建带JSON体的GET请求,再将响应内容转为异步枚举:
// 注入的HttpClient实例 [Inject] private HttpClient HttpClient { get; set; } = default!; public async Task LoadAgencyListAsync(GetAgencyListRequest request) { // 序列化请求对象为JSON内容 var requestContent = JsonContent.Create(request); // 构建带Body的GET请求 var httpRequest = new HttpRequestMessage(HttpMethod.Get, "/api/agencies/list") { Content = requestContent }; // 发送请求并获取响应(启用流式处理) using var response = await HttpClient.SendAsync( httpRequest, HttpCompletionOption.ResponseHeadersRead, CancellationToken.None); response.EnsureSuccessStatusCode(); // 将响应转为异步枚举 var agencyEnumerable = await response.Content.ReadFromJsonAsAsyncEnumerable<AgencyDto>(); // 遍历处理流式返回的数据 await foreach (var agency in agencyEnumerable) { // 示例:添加到本地绑定集合 AgencyList.Add(agency); } }
2. FastEndpoints服务端配置
默认FastEndpoints会拦截带Body的GET请求,需要在对应Endpoint配置中显式允许:
public class GetAgencyListEndpoint : Endpoint<GetAgencyListRequest, IAsyncEnumerable<AgencyDto>> { public override void Configure() { Get("/api/agencies/list"); // 关键配置:允许GET请求携带请求体 AllowRequestBodyForHttpGet(); } public override async Task HandleAsync(GetAgencyListRequest req, CancellationToken ct) { // 业务逻辑:从数据库或其他数据源获取流式结果 var agencyStream = await _agencyRepository.GetAgencyStreamAsync(req, ct); // 返回异步枚举 await SendAsync(agencyStream, cancellation: ct); } }
注意事项
- HTTP规范虽不推荐GET请求带Body,但现代浏览器、HttpClient及FastEndpoints均支持该场景
- 此方案既保留了
ReadFromJsonAsAsyncEnumerable的流式处理优势(适合大数据量返回),又能完整传递复杂请求对象 - 无需拆分复杂请求参数到QueryString,避免了参数拼接的繁琐和长度限制问题
内容的提问来源于stack exchange,提问作者FirstByte
相关产品推荐
相关产品推荐

