gpt4 book ai didi

c# - 在 ASP.NET Core 中从 ActionExecutionContext 的 HttpContext 中获取 RawBody

转载 作者:行者123 更新时间:2023-12-04 15:35:41 25 4
gpt4 key购买 nike

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

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);
}
}

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

示例 Controller 方法:
public async Task<IActionResult> Create([FromBody]CreateGroupRequest requestModel)

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

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

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

最佳答案

您可以在 .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();
}

关于c# - 在 ASP.NET Core 中从 ActionExecutionContext 的 HttpContext 中获取 RawBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59861461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com