提问人:Adam Wojnar 提问时间:11/16/2023 更新时间:11/16/2023 访问量:107
如何在 ASP.NET Core WebAPI 中将其转换为 C# 控制器类之前读取 json 正文?
How to read json body, before it's converted into C# controller class in ASP.NET Core WebAPI?
问:
拥有这个简单的端点:
[HttpPost]
public async Task<IActionResult> CreateUser([FromBody] UserInput userInput)
{
if (userInput == null) return BadRequest();
var userOutput = await _userService.AddUser(userInput);
return CreatedAtRoute("GetUser", new { userId = userOutput.UserId }, userOutput);
}
如何检索已发送的确切 json?
就像现在一样,json 输入中的所有字段都必须在类中实现。我想知道在将原始身体转换为类之前,是否还有一种方法可以捕获原始身体UserInput
UserInput
感谢您的帮助!
答:
2赞
Denis Micheal
11/16/2023
#1
您可以使用 HttpLogging 中间件来捕获此请求信息
HTTP 日志记录是一个中间件,用于记录有关传入 HTTP 的信息 请求和 HTTP 响应。HTTP 日志记录提供以下日志:
HTTP 请求信息 通用属性 标头 正文 HTTP 响应 信息
非常容易配置和设置,您可以添加任何请求头、响应头等来记录
builder.Services.AddHttpLogging(logging =>
{
logging.LoggingFields = HttpLoggingFields.All;
logging.RequestHeaders.Add("sec-ch-ua");
logging.ResponseHeaders.Add("MyResponseHeader");
logging.MediaTypeOptions.AddText("application/javascript");
logging.RequestBodyLogLimit = 4096;
logging.ResponseBodyLogLimit = 4096;
});
通过在 Your 中调用 this 将其添加到管道中:Program.cs
app.UseHttpLogging();
并将其添加到您的logLevel
appsettings.json
"Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
2赞
Ibram Reda
11/16/2023
#2
获取实际的 JSON 正文 当您在 中使用 Model Binding 时。NET5以上,有点棘手
首先,将此扩展方法添加到您的解决方案中,使我们的生活更轻松
public static async Task<string> GetRawBodyAsync(
this HttpRequest request,
Encoding encoding = null)
{
if (!request.Body.CanSeek)
{
// We only do this if the stream isn't *already* seekable,
// as EnableBuffering will create a new stream instance
// each time it's called
request.EnableBuffering();
}
request.Body.Position = 0;
var reader = new StreamReader(request.Body, encoding ?? Encoding.UTF8);
var body = await reader.ReadToEndAsync().ConfigureAwait(false);
request.Body.Position = 0;
return body;
}
我们需要在映射控制器/端点之前在管道中添加小型中间件,以使此方法正常工作
app.Use(next => context => {
context.Request.EnableBuffering();
return next(context);
});
现在,您可以在操作中获取 JSON 正文请求,如下所示
[HttpPost]
public async Task<IActionResult> CreateUser([FromBody] UserInput userInput)
{
string rawRequestBody = await Request.GetRawBodyAsync(); //<<< get your json as string
if (userInput == null) return BadRequest();
var userOutput = await _userService.AddUser(userInput);
return CreatedAtRoute("GetUser", new { userId = userOutput.UserId }, userOutput);
}
更多解释可以在 ASP.NET Core 中将原始请求正文读取为字符串中找到
评论