从 ASP.NET Core 中的 ActionExecutionContext 的 HttpContext 获取 RawBody
Get RawBody from HttpContext of ActionExecutionContext in ASP.NET Core
我有一个基础 class,我想在其中包含在我的所有控制器方法中执行的代码。在我的特殊情况下,我选择创建一个基础 class,覆盖 OnActionExecution
,并让我的控制器 class 继承自该基础 class。这很好用:
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。
问题:如何从 [=30] 中的 ActionExecutinContext
获取完整的请求正文(其中包括针对控制器发布的原始 JSON) =]核心?
您可以在 .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();
}
我有一个基础 class,我想在其中包含在我的所有控制器方法中执行的代码。在我的特殊情况下,我选择创建一个基础 class,覆盖 OnActionExecution
,并让我的控制器 class 继承自该基础 class。这很好用:
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。
问题:如何从 [=30] 中的 ActionExecutinContext
获取完整的请求正文(其中包括针对控制器发布的原始 JSON) =]核心?
您可以在 .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();
}