gpt4 book ai didi

c# - ASP.NET 核心 MVC : How to get raw JSON bound to a string without a type?

转载 作者:IT王子 更新时间:2023-10-29 03:54:47 24 4
gpt4 key购买 nike

类似于this关于以前的 ASP.NET 版本的老问题,我想让 HTTP POST 的请求正文绑定(bind)到一个字符串。看起来该方法已绑定(bind),但是当 ASP.NET 调用我的 Controller 方法时 value 为 null:

namespace Demo.Controllers
{

[Route("[controller]")]
public class WebApiDemoController : Controller
{
...

// POST api/values
[HttpPost]
public System.Net.Http.HttpResponseMessage Post([FromBody]string value)
{
// expected: value = json string, actual: json = null.
}

我还需要去溪流里抓尸体吗?或者这应该有效吗?在测试上述方法时,我使用了以下 http header :

Accept: Application/json
Content-Type: Application/json;charset=UTF-8

我在正文中传递以下内容:{ "a": 1 }

我不想绑定(bind)到名为 a 的字符串变量。我想绑定(bind)我得到的任何 JSON,然后我想在我的方法中使用 JSON 内容,任何任意内容。

如果我理解文档,[FromBody] 属性应该完成我想要的,但我猜测 ASP.NET 核心 MVC 绑定(bind)机制不会将 json 绑定(bind)到“字符串值”,但也许我可以做一些其他的事情来获得同等水平的灵 active 。

类似的问题here让我想到也许我应该编写 [FromBody] 动态数据 而不是使用 [FromBody] 字符串值

更新:在使用这种技巧之前应该考虑一下,因为如果您想让 .net 核心框架为您处理 JSON 和 XML 编码,那么您就扼杀了该功能。某些类型的 REST 服务器可以并且经常确实需要同时支持 XML 和 JSON 内容类型,至少我遇到过那些具有标准文档的服务器。

最佳答案

我发现的最干净的选择是添加您自己的简单 InputFormatter:

public class RawJsonBodyInputFormatter : InputFormatter
{
public RawJsonBodyInputFormatter()
{
this.SupportedMediaTypes.Add("application/json");
}

public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var request = context.HttpContext.Request;
using (var reader = new StreamReader(request.Body))
{
var content = await reader.ReadToEndAsync();
return await InputFormatterResult.SuccessAsync(content);
}
}

protected override bool CanReadType(Type type)
{
return type == typeof(string);
}
}

在 ConfigureServices 中的 Startup.cs 中:

services
.AddMvc(options =>
{
options.InputFormatters.Insert(0, new RawJsonBodyInputFormatter());
});

这将使您能够在 Controller 中获取原始 JSON 负载:

[HttpPost]
public IActionResult Post([FromBody]string value)
{
// value will be the request json payload
}

关于c# - ASP.NET 核心 MVC : How to get raw JSON bound to a string without a type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com