自从升级到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方法的请求对象总是空的。我注意到,由于控制器动作名带有“Get”前缀,Web API将其视为HTTP Get而不是POST。重命名控制器动作后,它现在按预期工作。

其他回答

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

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

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

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

{
    "value": "test"
}

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

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

"test"

如果您放入[FromBody]注释,并且有一个Dto对象作为方法的参数,但仍然无法获取数据,请开始查看Dto的属性和字段。

我也有同样的问题,我的DTO是空的。我发现原因是其中一个属性指向一个不能序列化的对象:(这导致媒体格式化器无法解析数据。因此对象总是空的。 希望它也能帮助到其他人

我也有同样的问题,并发现当将内容类型更改为“application/json”时并没有解决这个问题。然而“application / json;charset = utf - 8”工作。

尝试创建一个类作为数据模型,然后发送一个具有与数据模型类属性匹配的属性的JSON对象。(注:我已经测试了这个,它与我今天刚刚下载的最新的MVC 4 RC 2012一起工作)。

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

下面的JSON对象以HTTP-POST正文形式发送,内容类型为application/ JSON

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

我认为必须创建数据模型类的原因是假定简单值来自url参数,而假定单个复杂值来自主体。它们确实有[FromBody]和[FromUrl]属性,但使用[FromBody]字符串值仍然不适合我。看起来他们还在解决很多bug,所以我相信这在未来会改变。

编辑: 让XML在主体中工作。默认的XML序列化器被更改为DataContractSerializer而不是XmlSerializer。在我的全局中放入以下一行。Asax文件修复了这个问题(参考)

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;