如何从 ASP.NET Core 中的 Request.Body 读取参数



上下文:我的应用程序位于中央登录应用程序后面,每当用户申请访问我的应用程序时,我的应用程序都会收到包含用户信息的http请求。我需要从 HttpRequest 正文中检索用户信息。

这是我到目前为止尝试过的:

currentContext.HttpContext.Request.Query["user-name"].toString();  // got nothing
using (var reader = new StreamReader(currentContext.HttpContext.Request.Body))
{
var body = reader.ReadToEnd();
}   // I can get the raw HttpRequest Body as "user-name=some&user-email=something"

有什么方法可以用来解析 Request.Body 中的参数和值吗? 我尝试了以下方法,也一无所获。

HttpContext.Item['user-name'] \return nothing Request.Form["user-name"] \ return nothing

我无法使用模型绑定的原因是,在 HttpRequest 正文中,键名是"用户名",而在 c# 中,我无法创建带有"-"的变量

同时,在我的.net 4.6应用程序中,Request["KeyName"].toString()工作正常。

我想出了一种方法将原始HttpRequest正文转换为查询字符串,然后从中读取参数。

这是代码:

var queryString = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(requestBody);
string paramterValueIWant = queryString["KeyName"];

但有一个问题,当KeyName在体内不存在时,它会抛出异常。因此,您必须为空检查或尝试捕获。

我仍然觉得应该有一种更好的方法来读取参数,正如我提到的,在我的 .net 4.6 应用程序中,我需要做的就是Request["KeyName"].

假设我们正在谈论 POST/PUT/PATCH 调用,您可以使用
Request.Form["KeyName"]并将 Ajax 请求的"内容类型"设置为application/x-www-form-urlencoded
请注意,Request在您的方法中自动可用。无需显式调用它。

当使用GET/DELETE调用时,我更喜欢使用

[HttpGet("{UserId}")] // api/User/{UserId}
public IActionResult Get(int UserId){
// do stuff calling directly UserId
}

或使用 PUT/PATCH

[Route("User/{EntityId}/{StatusFilter}")] // api/User/{EntityId}/{StatusFilter}
[HttpPut] 
public IActionResult Put(int EntityId, int StatusFilter){
// do stuff calling directly EntityId and StatusFilter
}

然后,您仍然可以使用Request.Form["KeyName"]从身体获取数据

最新更新