我目前正在编写 ASP.NET Core Web 服务,我想设置一个端点来接收字符串中的 JSON 数据。我不想在端点开始之前解析它。
我已经定义了这个端点:
[HttpPost]
[Route("pushjson/{channelCode}")]
public async Task<string> PushJson(string channelCode,
[FromBody]string jsonData)
{
return await mediator.Send(new PushJsonCommand(channelCode, jsonData));
}
我正在发送正文中包含 JSON 对象的标准请求,但收到以下错误:
解析值时遇到意外字符:{。路径 '',第 1 行,位置 1。
jsonData 字段为必填项。
所以看起来框架试图解析提供的数据,这绝对是不期望的。下面的代码将根据配置决定如何处理和处理 JSON 数据,因此预解析只是浪费时间。
如何配置此端点以告诉框架仅将未处理和未解析的正文数据存储到字符串中并将其提供给我的方法?
更改代码以接收 JObject 可以让代码正常工作,但随后我确实进行了不需要的解析和序列化,这会白白浪费 CPU 时间。
[HttpPost]
[Route("pushjson/{channelCode}")]
public async Task<string> PushJson(string channelCode,
[FromBody]JObject jsonData)
{
return await mediator.Send(new PushJsonCommand(channelCode, JsonSerializer.Serialize(jsonData)));
}
似乎 ASP.NET 使用
JsonSerializer
自动解析正文,请参阅此处的备注:
备注
默认情况下,ASP.NET Core MVC 委托读取的责任 正文到输入格式化程序。以 ASP.NET Core Minimal 为例 API,主体由 JsonSerializer 反序列化。
我敢打赌,当您的
[HttpPost]
未指定它所使用的 Content Type 时,它被假定为“application/json”,尝试在端点上方添加此属性:
[Consumes("text/plain")]