自从升级到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安装
这招对我很管用:
Create a C# DTO class, with a property for every attribute you want to pass from jQuery/Ajax
public class EntityData
{
public string Attr1 { get; set; }
public string Attr2 { get; set; }
}
Define the web api method:
[HttpPost()]
public JObject AddNewEntity([FromBody] EntityData entityData)
{
Call the web api as such:
var entityData = {
"attr1": "value1",
"attr2": "value2"
};
$.ajax({
type: "POST",
url: "/api/YOURCONTROLLER/addnewentity",
async: true,
cache: false,
data: JSON.stringify(entityData),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
...
}
});
我对此很晚了,但也有类似的问题,在经过一天的大量回答和背景资料后,我找到了最简单/轻量级的解决方案,将一个或多个参数传递回Web API 2 Action如下:
这里假设您知道如何使用正确的路由设置Web API控制器/动作,如果不知道,请参考:https://learn.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api。
首先是控制器动作,这个解决方案还需要Newtonsoft。Json库。
[HttpPost]
public string PostProcessData([FromBody]string parameters) {
if (!String.IsNullOrEmpty(parameters)) {
JObject json = JObject.Parse(parameters);
// Code logic below
// Can access params via json["paramName"].ToString();
}
return "";
}
客户端使用jQuery
var dataToSend = JSON.stringify({ param1: "value1", param2: "value2"...});
$.post('/Web_API_URI', { '': dataToSend }).done(function (data) {
console.debug(data); // returned data from Web API
});
我发现的关键问题是确保您只发送一个整体参数回Web API,并确保它没有名称,只有值{":dataToSend},否则您的值将在服务器端为空。
通过这种方式,您可以以JSON结构向Web API发送一个或多个参数,并且不需要在服务器端声明任何额外的对象来处理复杂的数据。JObject还允许您动态遍历传入的所有参数,以便在参数随时间变化时实现更容易的可伸缩性。希望这能帮助像我一样挣扎的人。
在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,即使这种情况发生在对象层次结构的深处。