c# - 如何在 Web Api 的主体中传递派生的 JObject 类
问题描述
如果我有课
public class TestMe : JObject
{
}
如何在 API 方法中使用它?
public async Task<IHttpActionResult> UpdateMe(int accountId, [FromBody] TestMe sometest)
{
Console.WriteLine(sometest);
...
当我尝试为身体发布任何内容时,例如:
{
"Bye": "string"
}
Console.WriteLine
在方法中的行UpdateMe
甚至被命中之前,我收到以下错误:
"The parameters dictionary contains an invalid entry for parameter 'sometest' for method 'System.Threading.Tasks.Task`1[System.Web.Http.IHttpActionResult] UpdateMe(Int32, TestMe)' in '<somepath>.Controllers.MiscController'. The dictionary contains a value of type 'Newtonsoft.Json.Linq.JObject', but the parameter requires a value of type 'TestMe'."
解决方案
控制器不能接受直接从该类继承的JObject
类。(更多信息在这里)。我假设在您的情况下,您不知道您将在输入 JSON 中收到哪些属性。这些是可能的解决方案:
仅接受JObject
控制器中的类。
[Route("{accountID}")]
[HttpPost]
public async Task<IHttpActionResult> UpdateMe(int accountId, [FromBody] JObject sometest)
{
string test = sometest.ToString();
return Ok(test);
}
你可以JObject
随心所欲地与班级一起工作。示例 -在此处阅读更多内容。
这是解决问题的一种方法。
另一种解决方案是将 JSON 正文作为原始 JSON 读取,并根据您的需要进行操作:
[Route("{accountID}")]
[HttpPost]
public async Task<IHttpActionResult> UpdateMe(int accountId)
{
string rawContent = string.Empty;
using (var contentStream = await this.Request.Content.ReadAsStreamAsync())
{
contentStream.Seek(0, SeekOrigin.Begin);
using (var sr = new StreamReader(contentStream))
{
rawContent = sr.ReadToEnd();
// use raw content here
}
}
return Ok(rawContent);
}
未知输入 JSON 的另一种解决方案是接受dynamic
控制器中的类型,但我个人不建议这样做。如何实现它阅读这里。为什么我不喜欢它,请在此处查看。
推荐阅读
- python - 如何使用 sqlalchemy 连接到 sql server
- python - 如何使用 Python 打印字符串循环 0000,....,0009,000A,000B,....,000F,0010,...,4000
- python - minio python客户端,如何导入标签
- c++ - 为什么在使用带有 decltype 的尾随返回类型调用具有相同名称的函数时,模板实例化中会发生无限递归?
- php - 如何设置文件大小?
- python - 使用 Python 从 Bloomberg 中抓取交互式图表
- php - preg_match 清理输入以获得最佳安全性
- python - 在 python 3.9.6 Windows Visual Studio 代码上安装 Pandas 的问题
- jquery - 如何在将鼠标悬停在弹出框上时保持弹出框活着(在 td 元素上)
- node.js - 如何流式传输来自 openpgp.encrypt 的输出?