自从升级到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]更改为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报头。
在Angular中,我可以这样传递数据:
data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }
在Web API控制器中:
[HttpPost]
public Hashtable Post([FromBody]string jsonString)
{
IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
string username = data["u"];
string pwd = data["p"];
......
或者,我也可以像这样发布JSON数据:
data: { PaintingId: 1, Title: "Animal show", Price: 10.50 }
并且,在控制器中,接受这样的类类型:
[HttpPost]
public string POST(Models.PostModel pm)
{
....
}
两种方式都可以,如果你在API中有一个已经建立的公共类,那么就发布JSON,否则就发布'=' + JSON.stringify({..:…, . .:…})