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

ASP.NET WebApi中间件问题:无法获取端点元数据与读取请求体

解决ASP.NET WebApi中间件的两个问题

一、Endpoint返回null的问题

原因

中间件注册顺序错误。EndpointRoutingMiddleware(对应代码里的app.UseRouting())负责完成路由匹配并设置Endpoint对象,如果你的PlausibilityMiddleware注册在UseRouting()之前,此时路由还未匹配,Endpoint自然为空。

解决方案

调整中间件注册顺序,确保PlausibilityMiddleware在app.UseRouting()之后、app.UseEndpoints()之前注册。示例配置代码:

var app = builder.Build();

// 其他中间件(如日志、CORS等)...

app.UseRouting();

// 在这里注册你的自定义中间件
app.UseMiddleware<PlausibilityMiddleware>();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

二、读取请求体的正确方式

请求体流默认只能被读取一次,直接读取会导致后续控制器无法获取请求数据,需要先启用缓冲并重置流位置。

修改中间件的InvokeAsync方法,添加读取逻辑:

public async Task InvokeAsync(HttpContext context)
{
    try
    {
        if (!CanProcess(context))
        {
            await _next(context);
            return;
        }

        // 启用请求体缓冲,允许多次读取
        context.Request.EnableBuffering();

        // 读取请求体(以文本格式为例,JSON/表单数据通用)
        string requestBody;
        using (var reader = new StreamReader(context.Request.Body, leaveOpen: true))
        {
            requestBody = await reader.ReadToEndAsync();
            // 重置流位置,确保后续中间件/控制器能正常读取
            context.Request.Body.Position = 0;
        }

        Log.Trace(requestBody);

    }
    catch (Exception ex)
    {
        Log.Error("Unknown error occured while validate pre import");
        Log.Error(ex);
    }

    await _next(context);
}

如果需要读取二进制类型的请求体,可替换为读取字节数组的方式,核心同样是启用缓冲并重置流位置。

内容的提问来源于stack exchange,提问作者Felix Arnold

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:51:06