自从升级到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,所以它会填充。

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

其他回答

我一直在寻找这个问题的解决方案,所以我将分享我的解决方案。

如果你发布一个模型,你的模型需要有一个空的/默认的构造函数,否则模型显然不能被创建。 重构时要小心。;)

我在使用邮差时也犯了同样的错误。将值作为json对象而不是字符串传递

{
    "value": "test"
}

显然,当api参数的类型是字符串时,上面的一个是错误的。

因此,只需在api体中以双引号传递字符串:

"test"

我在《小提琴手》里也遇到了同样的问题。我已经有Content-Type: application/json;请求头中的charset=utf-8或Content-Type: application/json。

我的请求体也是一个普通的字符串,在Fiddler中我写了:{'controller':'ctrl'}。这使得POST方法中的字符串参数为空。

修正:记住使用引号,从而表示字符串。也就是说,我通过编写“{'controller':'ctrl'}”来修复它。(注意:在编写JSON时,要么一定要使用撇号,要么像这样转义引号:"{\"controller\":\"ctrl\"}")。

我今天一直在想这件事。

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

对我来说最好的解决方案是完全HTTP,如下所示:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

然后将字符串反序列化为post body中期望的对象。 对我来说,WS_OpenSession是一个包含会话id、用户和密钥的类。

您可以从那里使用param对象并访问它的属性。

非常非常有效。

我说的是从这个url来源的:

http://bizcoder.com/posting-raw-json-to-web-api