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


当前回答

因为你只有一个参数,你可以尝试用[FromBody]属性来修饰它,或者改变方法来接受一个带值的DTO作为属性,就像我在这里建议的:MVC4 RC WebApi参数绑定

更新:官方ASP。NET网站今天更新了一个很好的解释:https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1

简而言之,当在body中发送单个简单类型时,只发送带有等号(=)前缀的值,例如body:

=测试

其他回答

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

我今天一直在想这件事。

我的解决方案是将[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报头。

因为你只有一个参数,你可以尝试用[FromBody]属性来修饰它,或者改变方法来接受一个带值的DTO作为属性,就像我在这里建议的:MVC4 RC WebApi参数绑定

更新:官方ASP。NET网站今天更新了一个很好的解释:https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1

简而言之,当在body中发送单个简单类型时,只发送带有等号(=)前缀的值,例如body:

=测试

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

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

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

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

JSON.stringify(…)解决了我的问题