自从升级到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 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还允许您动态遍历传入的所有参数,以便在参数随时间变化时实现更容易的可伸缩性。希望这能帮助像我一样挣扎的人。

其他回答

仔细检查您的数据类型。dotnet模型绑定器不会将浮点数转换为整数(我假设有其他相关概念)。这将导致整个模型被拒绝。

如果你有这样的json:

{
    "shoeSize": 10.5
}

但是你的c#模型是这样的:

class Shoe{
    public int shoeSize;
}

模型绑定器将拒绝该模型,您将得到null。

我有一个类似的问题,有或没有[FromBody]标签时,通过AJAX调用发送原始数据上传图像。当请求太大时,控制器会转储它(变量= null),所以解决方案是增加最大请求大小,调整图像大小或类似的方法。

增加请求大小的方法描述在这里:https://stackoverflow.com/a/16403447

我刚刚使用Fiddler发生了这种情况。问题是我没有指定Content-Type。

尝试在POST请求中包含Content-Type头。

Content-Type: application/x-www-form-urlencoded

或者,根据下面的注释,您可能需要包含一个JSON头

Content-Type: application/json

我知道这不是问题的答案,但我在寻找解决问题的方法时偶然发现了它。

在我的情况下,复杂类型没有被绑定,但我没有做一个POST,我正在做一个GET与查询字符串参数。解决方案是在参数中添加[FromUri]:

public class MyController : ApiController
{
    public IEnumerable<MyModel> Get([FromUri] MyComplexType input)
    {
        // input is not null as long as [FromUri] is present in the method arg
    }
}

我对此很晚了,但也有类似的问题,在经过一天的大量回答和背景资料后,我找到了最简单/轻量级的解决方案,将一个或多个参数传递回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还允许您动态遍历传入的所有参数,以便在参数随时间变化时实现更容易的可伸缩性。希望这能帮助像我一样挣扎的人。