【发布时间】:2021-08-18 11:24:19
【问题描述】:
我正在尝试读取从客户端发送到我的后端的请求正文。内容以 JSON 格式发送,并让用户从表单中输入。如何在为控制器路由设置的中间件中读取请求正文。
这是我的模型
namespace ChatboxApi.Models
{
public class User
{
public string Login { get; set; } = default;
public string Password { get; set; } = default;
public string Email { get; set; } = default;
public string FullName { get; set; } = default;
public int Phone { get; set; } = default;
public string Website { get; set; } = default;
}
}
这是我的控制器
namespace ChatboxApi.Controllers
{
[ApiController]
[Route("api/signup")]
public class SignupController : ControllerBase
{
[HttpPost]
public ActionResult SignUp([FromBody] User user)
{
return Ok(user);
}
}
}
这是我的中间件类
namespace ChatboxApi.Middleware
{
public class CreateSession
{
private readonly RequestDelegate _next;
public CreateSession(RequestDelegate next)
{
this._next = next;
}
public async Task Invoke(HttpContext httpContext)
{
//I want to get the request body here and if possible
//map it to my user model and use the user model here.
}
}
【问题讨论】:
-
你不应该将中间件用于这样的事情,imo。理想情况下,您的请求路由应该仅取决于请求路径 - 或最多取决于 HTTP 请求标头。您不应根据请求正文的内容进行路由。这只是自找麻烦 - 尤其是因为 ASP.NET 甚至会在收到请求正文之前路由请求 - 这解释了您遇到的问题。
-
所以你的意思是在控制器中完成工作比在中间件中更好?
-
是的。 “工作”不应在中间件中完成 - 中间件应用于设置请求处理环境或为实际处理程序提供服务(例如设置失败请求日志记录、解压缩 gzip-compressed请求正文等)。
-
嗨@championq45,有什么更新吗?我的回答是否帮助您解决了您的问题?如果可以,请您接受作为答案吗?如果没有,请您跟进让我知道吗?参考:How to accept as answer。谢谢。
-
@Rena 谢谢你的提醒。您的答案确实有效,并且已被标记为问题的答案。
标签: c# asp.net .net asp.net-mvc asp.net-core-middleware