You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Blazor组件中获取POST请求的请求体

在Blazor中处理POST请求体的实现方案

Blazor组件本身的路由体系主要为客户端导航设计,无法直接接收并解析POST请求体,以下是两种可行的实现方案:

方案一:通过ASP.NET Core API控制器中转

这是最通用的做法,先由API控制器接收POST请求并解析请求体,再由Blazor组件调用API获取数据用于后续处理。

  1. 创建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; }
}
  1. 在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读取。

  1. 创建自定义中间件
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>();
    }
}
  1. 在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();
  1. 在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,提问作者Александр Попов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:33:21