如何在 ASP.NET dotNET 8.0 控制器中以 JObject 形式接收来自 post 请求的 Json 参数?

问题描述 投票:0回答:2

我有一个功能完美的应用程序,内置于 Angular 13 和 dotNet core 2.1。现在我正在将其从 dotNet core 2.1 升级到 dotNet 8.0。我已成功升级所有其他功能,但仍停留在以 JObject 形式接收参数。

在旧版本中,我从前端以 json 形式传递参数,例如

"{"query":"dotNet"}"

后端控制器动作结构如下。

 [HttpPost]
 public async Task<IActionResult> GetDataAsync([FromBody] JObject jSearchItems)
 {
     try
     {
         dynamic SearchItems = jSearchItems;
         string query = SearchItems.query;

         ServiceResponse response = await _Service.GetDataAsync(query);


         return StatusCode((int)(response.IsValid ? HttpStatusCode.OK : HttpStatusCode.BadRequest), response);
     }
     catch (Exception ex)
     {
         return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message);
     }
 }

注意函数参数的类型是

JObject

在 dotNet core 2.1 中它工作正常,但是当我将其升级到 dotNet 8.0 时,控制器中接收到的数据为 null。如果我为参数创建一个新模型如下

class SearchItem
{
    public string query { get; set; }
}

将参数类型从

JObject
更改为
SearchItem
即可正确接收数据。

但是我不想创建数百个类,因为这个应用程序中有很多 api。

那么如何在 ASP.NET dotNET 8.0 控制器中以 JObject 形式接收来自 post 请求的 Json 参数?

c# angular asp.net-web-api asp.net-core-2.1 .net-8.0
2个回答
0
投票

试试这个:

首先安装nuget包Microsoft.AspNetCore.Mvc.NewtonsoftJson 然后在program.cs中添加:

builder.Services.AddControllers().AddNewtonsoftJson();

0
投票

从 ASP.NET Core 3.0 及更高版本中,使用的默认 JSON 序列化器是

System.Text.Json
,与早期版本中使用的
Newtonsoft.Json
库相比,其行为可能有所不同。在您的情况下,当接收 JSON 负载作为
JObject
时,
System.Text.Json
可能不会像
JObject
那样自动将请求正文绑定到
Newtonsoft.Json
对象。

但是,您仍然可以通过将请求正文作为字符串读取,然后手动将其解析为

JObject
来实现类似的行为。具体方法如下:

例如:

[HttpPost]
public async Task<IActionResult> GetDataAsync()
{
    try
    {
        // Read the request body as a string
        using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
        {
            string requestBody = await reader.ReadToEndAsync();
            
            JObject jSearchItems = JObject.Parse(requestBody);
            
            string query = (string)jSearchItems["query"];

            // ServiceResponse response = await _Service.GetDataAsync(query);

            return Ok(new { query }); 
        }
    }
    catch (Exception ex)
    {
        return StatusCode(500, ex.Message);
    }
}

此方法允许您在 ASP.NET Core 3.0 及更高版本中以

JSON
形式接收
JObject
参数,而无需为每个 API 端点显式定义模型类。

© www.soinside.com 2019 - 2024. All rights reserved.