自从升级到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安装


当前回答

在ASP中也遇到过类似的问题。NET Core和另一个可能的原因是ASP。NET绑定(沉默)失败,由于各种原因,如发送null被绑定到一个非null属性:

{
    "prop1":1139357,
    "prop2":1139356,

    "items":[
        {"key":"15","someprop":34,"notnullprop":null},
        {"key":"16","someprop":34,"notnullprop":null},
        {"key":"22","someprop":34,"notnullprop":null}]
}

在这种情况下,不会抛出异常,整个模型将为null,即使这种情况发生在对象层次结构的深处。

其他回答

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

仅仅通过:

我的价值

将在控制器中获取为null。

但如果你通过了:

“我的价值”

这个值是正确的。

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

在我的情况下,问题是参数是一个字符串而不是一个对象,我把参数改为Newsoft的JObject。Json,它可以工作。

经过一些尝试后,我认为默认行为是正确的,没有什么可以破解的。

唯一的技巧是:如果你的post方法参数是如下所示的字符串,你应该在正文中发送一个带有双引号的普通字符串(当使用ajax或postman时),例如:

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

否则,如果你在post正文中发送了一个没有外双引号和转义内引号的json字符串,那么它应该能够被解析为模型类(参数类型),例如,{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}

在我的例子中,用Newtonsoft的[JsonObject(memberseriizable . optout)]属性装饰参数类就很管用。

例如:

[HttpPost]
[Route("MyRoute")]
public IHttpActionResult DoWork(MyClass args)
{
   ...
}

[JsonObject(MemberSerialization.OptOut)]
public Class MyClass
{
    ...
}

我知道OP最初是发送一个字符串,但是为了将来的参考,同样值得注意的是,畸形的JSON也将作为null到达post方法。在我的例子中,两个属性之间缺少了逗号,导致了原本正常的破坏。