自从升级到RC的WebAPI,我有一些真正奇怪的问题时调用POST在我的WebAPI。 我甚至回到了在新项目上生成的基本版本。所以:

public void Post(string value)
{
}

提琴手喊道:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

当我调试时,字符串“value”永远不会被赋值。它总是NULL。 有人有这个问题吗?

(我第一次看到这个问题是在一个更复杂的类型上)

这个问题不仅仅局限于ASP。在asp.net MVC 4中,同样的问题出现在一个新的ASP。NET MVC 3项目后RC安装


当前回答

总有一天,我只是有同样的问题,在我的情况下,问题是,类,我是使用json容器,没有得到和设置定义,所以,API不知道如何填充json数据到实例。

我的示例json类是。

public class Usuario
{
    public int id { get; set; }
    public string nombre { get; set; }
}

如你所见,你分别有get和set,所以它会填充。

如果你删除了它们,你会得到创建类的空实例的帖子。

其他回答

我今天一直在想这件事。

我的解决方案是将[FromBody]更改为HttpRequestMessage,本质上是向上移动HTTP堆栈。

在我的情况下,我发送数据通过有线这是压缩json,然后base64d。所有这些都来自一个安卓应用程序。

我的web端点的原始签名是这样的(使用[FromBody]):

我解决这个问题的方法是恢复为端点的签名使用HttpRequestMessage。

然后你可以使用这行代码访问post数据:

这一工作,并允许您访问原始的未触及的post数据。你不需要摆弄fiddler,在字符串的开头放一个=号,或者改变content-type。

作为题外话,我首先尝试遵循上面的答案之一,即将内容类型更改为:“content - type: application/x-www-form-urlencoded”。对于原始数据,这是一个坏建议,因为它去掉了+字符。

因此,一个base64字符串以这样的方式开始:“MQ0AAB+LCAAAAAA”结束为这样的“MQ0AAB LCAAAAAA”!不是你想要的。

使用HttpRequestMessage的另一个好处是,您可以从端点内访问所有http报头。

我有同样的问题,获得null作为参数,但它与大对象有关。事实证明,这个问题与IIS最大长度有关。它可以在web.config中配置。

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

我想知道为什么Web API抑制错误并向我的API发送空对象。我使用Microsoft.AspNet.WebApi.Tracing发现了这个错误。

我尝试了这个帖子中的许多答案,但没有一个对我有用。然后我在一个类似的帖子中看到了这个答案:https://stackoverflow.com/a/40853424/2120023,他提到HttpContext. request . body,所以另一个搜索,我发现这个https://stackoverflow.com/a/1302851/2120023给了我HttpContext。当前,所以我终于得到了这个工作使用:

HttpContext.Current.Request.Form.Get("value");

邮差的要求:

curl --location --request POST 'https://example.com/token' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'value=test'

对于那些与Swagger或Postman有相同问题的人,如果你在post中传递一个简单的属性作为字符串,即使指定了“ContentType”,你仍然会得到一个空值。

仅仅通过:

我的价值

将在控制器中获取为null。

但如果你通过了:

“我的价值”

这个值是正确的。

这里的名言起了作用。当然,这只是给斯威格和波兹曼的。例如,在使用Angular的Frontend应用中,这个问题应该由框架自动解决。

我刚刚使用Fiddler发生了这种情况。问题是我没有指定Content-Type。

尝试在POST请求中包含Content-Type头。

Content-Type: application/x-www-form-urlencoded

或者,根据下面的注释,您可能需要包含一个JSON头

Content-Type: application/json