【问题标题】:Get RawBody from HttpContext of ActionExecutionContext in ASP.NET Core从 ASP.NET Core 中 ActionExecutionContext 的 HttpContext 获取 RawBody
【发布时间】:2020-05-08 17:10:59
【问题描述】:

我有一个基类,我想在其中包含正在我的所有控制器方法中执行的代码。在我的特殊情况下,我选择创建一个基类,覆盖OnActionExecution,并让我的控制器类从该基类继承。这很好用:

public class BaseController : Controller
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        string parsedParameters = string.Empty;
        if (context.ActionArguments.Count > 0)
        {
            inputParameters = JsonConvert.SerializeObject(context.ActionArguments.First().Value,
                                    Formatting.None,
                                    new JsonSerializerSettings
                                    {
                                        NullValueHandling = NullValueHandling.Ignore,
                                    });
        }

        // ...

        base.OnActionExecuting(context);
    }
}

此代码从控制器方法中获取映射视图模型并将其转换为 JSON(用于记录目的)

示例控制器方法:

public async Task<IActionResult> Create([FromBody]CreateGroupRequest requestModel)

我目前面临的问题是不包含已传递给端点的附加 json 值,因为它们不会被映射(因为视图模型中不存在此类目标属性)

我想访问Request 对象的原始正文。根据我所阅读的内容,如果请求正文流已经被读取过一次,则很难访问它。我找到了多种关于如何读取请求正文流的解决方案,但它们似乎只适用于 .NET Framework 而不是 .NET Core。

问题:如何在 ASP.NET Core 中从 ActionExecutinContext 获取完整的请求正文(包括针对控制器发布的原始 JSON)?

【问题讨论】:

    标签: c# asp.net-core asp.net-web-api asp.net-core-3.1


    【解决方案1】:

    您可以在 .net core 3.x 中使用 EnableBuffering() 来启用请求正文以进行多次读取:

    var bodyStr = "";
    var req = context.HttpContext.Request;
    req.EnableBuffering();
    req.Body.Position = 0;
    using (var stream = new StreamReader(req.Body))
    {
        bodyStr = stream.ReadToEnd();
    }
    

    【讨论】:

    • 在我的情况下,解决方案在没有 req.EnableBuffering(); 的情况下工作。
    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2019-11-22
    • 2013-07-12
    • 2020-09-22
    • 2021-05-05
    • 2018-10-25
    相关资源
    最近更新 更多