如何在Blazor组件中获取POST请求的请求体
在Blazor中处理POST请求体的实现方案
Blazor组件本身的路由体系主要为客户端导航设计,无法直接接收并解析POST请求体,以下是两种可行的实现方案:
方案一:通过ASP.NET Core API控制器中转
这是最通用的做法,先由API控制器接收POST请求并解析请求体,再由Blazor组件调用API获取数据用于后续处理。
- 创建API控制器处理POST请求
[ApiController] [Route("api/[controller]")] public class DataReceiverController : ControllerBase { [HttpPost] public IActionResult ReceivePostData([FromBody] RequestDataModel requestData) { // 可在此对请求体数据做预处理,比如存储到缓存或数据库 return Ok(requestData); } } // 定义请求体对应的模型 public class RequestDataModel { public string Content { get; set; } public int TypeId { get; set; } }
- 在Blazor组件中调用API获取数据
@inject HttpClient Http @code { private RequestDataModel receivedPostData; protected override async Task OnInitializedAsync() { // 若需主动触发请求,可传入对应参数;若被动接收,可通过外部事件触发此逻辑 var response = await Http.PostAsJsonAsync("api/datareceiver", new { /* 可选请求参数 */ }); receivedPostData = await response.Content.ReadFromJsonAsync<RequestDataModel>(); // 此处编写receivedPostData的后续处理逻辑 } }
方案二:自定义中间件拦截POST请求(仅适用于Blazor Server/Interactive Server模式)
通过自定义中间件拦截指定路径的POST请求,解析请求体后存入HttpContext.Items,再在Blazor组件中通过IHttpContextAccessor读取。
- 创建自定义中间件
public class PostBodyMiddleware { private readonly RequestDelegate _next; public PostBodyMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 拦截指定Blazor页面路径的POST请求 if (context.Request.Method == HttpMethods.Post && context.Request.Path.StartsWithSegments("/target-blazor-page")) { // 读取并解析请求体 using var streamReader = new StreamReader(context.Request.Body); var rawBody = await streamReader.ReadToEndAsync(); var parsedData = JsonSerializer.Deserialize<RequestDataModel>(rawBody); // 将解析后的数据存入HttpContext.Items context.Items["PostRequestBody"] = parsedData; } await _next(context); } } // 注册中间件的扩展方法 public static class MiddlewareExtensions { public static IApplicationBuilder UsePostBodyMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<PostBodyMiddleware>(); } }
- 在Program.cs中注册服务与中间件
var builder = WebApplication.CreateBuilder(args); // 注册HttpContextAccessor服务 builder.Services.AddHttpContextAccessor(); // 注册Blazor相关服务 builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); var app = builder.Build(); // 启用自定义中间件(需放在Blazor路由配置之前) app.UsePostBodyMiddleware(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
- 在Blazor组件中读取请求体数据
@inject IHttpContextAccessor HttpContextAccessor @code { private RequestDataModel postRequestBody; protected override void OnInitialized() { if (HttpContextAccessor.HttpContext?.Items.TryGetValue("PostRequestBody", out var data) == true) { postRequestBody = data as RequestDataModel; // 编写后续处理逻辑 } } public class RequestDataModel { public string Content { get; set; } public int TypeId { get; set; } } }
注意事项
- Blazor WebAssembly模式下无服务器端
HttpContext支持,只能采用API控制器方案。 - 处理请求体时需添加数据验证逻辑,避免恶意数据注入风险。
内容的提问来源于stack exchange,提问作者Александр Попов
相关产品推荐
相关产品推荐

