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


当前回答

对于复杂类型,Web API尝试使用媒体类型格式化器从消息体中读取值。

请检查是否有任何[Serializable]属性装饰你的模型类。

删除该属性以查看它是否有效。这对我很管用。

其他回答

在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,即使这种情况发生在对象层次结构的深处。

我有一个类似的问题,我的Web API方法的请求对象总是空的。我注意到,由于控制器动作名带有“Get”前缀,Web API将其视为HTTP Get而不是POST。重命名控制器动作后,它现在按预期工作。

这个链接帮助了我:http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

基本上,它说你应该为参数使用一个空名称:

public string Post([FromBody]string myParameter){ 
...
}  

$.post("/api/dosomething", { '' : "myvalue" });

添加一行

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

到function protected void Application_Start()在Global.asax.cs中为我修复了类似的问题。净MVC3。

我也遇到过这个问题,这就是我解决问题的方法

webapi守则:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

客户机代码:

$.post( "webapi/address", { value: "some value" } );