WebApi2控制器Post方法始终接收空的FromBody

安迪·纽金特(Andy Nugent)

我的POST方法中的[FromBody]一直存在问题。

我已经在VS2019中使用最小的应用程序重现了它:

  • 创建项目ASP.NET Web应用程序(.NET Framework)
  • 选择Web API

这将使用以下方法使用ValuesController类创建一个骨架项目:

public void Post([FromBody] string value)
{
}

我在“ IIS Express(Google Chrome)”中运行此项目,然后浏览至https:// localhost:44358 / api / values,该方法可以正常工作,并且命中了Get方法中的断点。

然后,我尝试使用cUrl发布数据:

curl --header "Content-Type: application/json" --url https://localhost:44358/api/values --data "wibble"

断点是在VS2019中命中的,但该值为null(我期望“摆动”)。

我可以在请求内容中看到长度为6,并且该长度根据我传递到数据中的字符串的长度而变化,但是调用读取它会返回空字符串或零的byte []。

this.Request.Content.ReadAsStringAsync().Result     ""
this.Request.Content.Headers.ContentType            {application/json}
this.Request.Content.Headers.ContentLength          6

尝试使用HttpClient从另一个C#应用程序进行POST也会显示相同的结果。

我想念什么?该问题发生在默认的骨架应用程序中,并且每个人都没有抱怨这一事实,这表明它一定很明显,但是...

更新

我在Fiddler中看到了相同的问题,但是使用以下方法使其可以与HttpClient一起使用:

client.PostAsync<string>(url, "wibble", new JsonMediaTypeFormatter()).Result;

但是以下内容不起作用(接收为null):

client.PostAsync(url, new StringContent("wibble", Encoding.UTF8), new JsonMediaTypeFormatter()).Result;
安迪·纽金特(Andy Nugent)

从以下位置更改生成的代码:

public void Post([FromBody] string value) { ... }

至:

public void Post([FromBody] MyClass value) { ... }

现在可以使用标准的cUrl / Fiddler / Javascript / etc POST进行工作。

因此,我想问题在于尝试将字符串自动转换为对象,这可以解释为什么很多人没有这个问题。

如果您确实要发布文本,则自动生成的控制器(看起来应该可以执行您想要的操作)不起作用。

要解决此问题,请将Post方法更改为:

public void Post()
{
    string value = Request.Content.ReadAsStringAsync().Result;
    ...
}

没有[FromBody]now意味着Request.Content.ReadAsStringAsync()将按预期返回内容。

综上所述:

[Route("api/values/obj")]
public void Post([FromBody] MyObject value) /* OK */
{
    ...
}

[Route("api/values/str")]
public void Post([FromBody] string value) /* FAIL */
{
    ...
}

[Route("api/values/str2")]
public void Post() /* OK */
{
    string value = Request.Content.ReadAsStringAsync().Result;
    ...
}

从cUrl获得以下结果:

curl "http://localhost:59801/api/Values/obj"  --header "Content-Type: application/json" --data "{id:1, name:'Andy'}"

curl "http://localhost:59801/api/Values/str2" --header "Content-Type: text/plain"       --data "wibble"

curl "http://localhost:59801/api/Values/str2" --header "Content-Type: application/json" --data "wobble"

curl "http://localhost:59801/api/Values/str"  --header "Content-Type: text/plain"       --data "wibble"

失败。异常'此资源不支持请求实体的媒体类型'text / plain'。

curl "http://localhost:59801/api/Values/str"  --header "Content-Type: application/json" --data "wobble"

失败。值为空。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WebApi2属性路由继承的控制器

来自分类Dev

使用标头值对WebAPI2控制器方法进行单元测试

来自分类Dev

使用WebApi2控制器和数据表检查请求查询

来自分类Dev

Laravel:控制器方法在调用时接收空参数

来自分类Dev

如何为POST方法设置WebAPI控制器

来自分类Dev

使用Json.NET的WebApi2控制器无法反序列化单个属性

来自分类Dev

尝试使用Axios与FormData发送POST时,MVC控制器接收到空数据

来自分类Dev

如何在WebAPI控制器中接收动态数据

来自分类Dev

Asp Core 3-如何在控制器方法中允许可为空的[FromBody]对象

来自分类Dev

如何在Web API控制器的Post方法中接收动态数据

来自分类Dev

控制器中的参数始终为空

来自分类Dev

ASP MVC控制器从Ajax接收空值

来自分类Dev

在mvc控制器中接收为空的Javascript对象

来自分类Dev

Grails中的jQuery Datepicker,控制器接收空

来自分类Dev

部分视图-控制器接收空对象

来自分类Dev

Grails中的jQuery Datepicker,控制器接收空

来自分类Dev

通过AJAX在控制器操作中接收空值

来自分类Dev

提交表单ajax,在控制器中接收空值

来自分类Dev

从 angulajs 到 MVC 控制器接收空数据

来自分类Dev

IIS Express上托管的ASP.NET WebAPI2可以从2个不同的项目中加载控制器

来自分类Dev

滑轨控制器中的空方法

来自分类Dev

C#MVC AngularJS:调用了控制器方法,但未从$ http.post()方法接收值

来自分类Dev

HttpPostedFileBase retun null始终在控制器发布方法中

来自分类Dev

从多个视图控制器接收委托方法调用

来自分类Dev

如何从控制器中的Ajax send()方法接收数据

来自分类Dev

Codeigniter表单POST在控制器从视图中为空

来自分类Dev

如何从控制器将ViewModel传递给Webapi方法

来自分类Dev

webapi控制器调用错误的方法

来自分类Dev

在WebApi 2控制器中获取标题值

Related 相关文章

  1. 1

    WebApi2属性路由继承的控制器

  2. 2

    使用标头值对WebAPI2控制器方法进行单元测试

  3. 3

    使用WebApi2控制器和数据表检查请求查询

  4. 4

    Laravel:控制器方法在调用时接收空参数

  5. 5

    如何为POST方法设置WebAPI控制器

  6. 6

    使用Json.NET的WebApi2控制器无法反序列化单个属性

  7. 7

    尝试使用Axios与FormData发送POST时,MVC控制器接收到空数据

  8. 8

    如何在WebAPI控制器中接收动态数据

  9. 9

    Asp Core 3-如何在控制器方法中允许可为空的[FromBody]对象

  10. 10

    如何在Web API控制器的Post方法中接收动态数据

  11. 11

    控制器中的参数始终为空

  12. 12

    ASP MVC控制器从Ajax接收空值

  13. 13

    在mvc控制器中接收为空的Javascript对象

  14. 14

    Grails中的jQuery Datepicker,控制器接收空

  15. 15

    部分视图-控制器接收空对象

  16. 16

    Grails中的jQuery Datepicker,控制器接收空

  17. 17

    通过AJAX在控制器操作中接收空值

  18. 18

    提交表单ajax,在控制器中接收空值

  19. 19

    从 angulajs 到 MVC 控制器接收空数据

  20. 20

    IIS Express上托管的ASP.NET WebAPI2可以从2个不同的项目中加载控制器

  21. 21

    滑轨控制器中的空方法

  22. 22

    C#MVC AngularJS:调用了控制器方法,但未从$ http.post()方法接收值

  23. 23

    HttpPostedFileBase retun null始终在控制器发布方法中

  24. 24

    从多个视图控制器接收委托方法调用

  25. 25

    如何从控制器中的Ajax send()方法接收数据

  26. 26

    Codeigniter表单POST在控制器从视图中为空

  27. 27

    如何从控制器将ViewModel传递给Webapi方法

  28. 28

    webapi控制器调用错误的方法

  29. 29

    在WebApi 2控制器中获取标题值

热门标签

归档