自从升级到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安装


当前回答

在我的情况下,问题是参数是一个字符串而不是一个对象,我把参数改为Newsoft的JObject。Json,它可以工作。

其他回答

不管你想要发布什么类型的值,只要把它括在引号里,就可以得到字符串。不适合复杂类型。

javascript:

    var myData = null, url = 'api/' + 'Named/' + 'NamedMethod';

    myData = 7;

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = "some sentence";

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = { name: 'person name', age: 21 };

    $http.post(url, "'" + JSON.stringify(myData) + "'")
         .then(function (response) { console.log(response.data); });

    $http.post(url, "'" + angular.toJson(myData) + "'")
         .then(function (response) { console.log(response.data); });

c#:

    public class NamedController : ApiController
    {
        [HttpPost]
        public int NamedMethod([FromBody] string value)
        {
            return value == null ? 1 : 0;
        }
    }

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

如果你确定你发送的JSON,那么你必须仔细跟踪你的API:

安装Microsoft.AspNet.WebApi.Tracing包 添加config.EnableSystemDiagnosticsTracing ();在WebApiConfig类的Register方法中。

现在查看Debug输出,您可能会发现一个无效的ModelState日志条目。

如果ModelState无效,你可以在它的Errors中找到真正的原因:

没有人能猜到这样一个例外:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

总有一天,我只是有同样的问题,在我的情况下,问题是,类,我是使用json容器,没有得到和设置定义,所以,API不知道如何填充json数据到实例。

我的示例json类是。

public class Usuario
{
    public int id { get; set; }
    public string nombre { get; set; }
}

如你所见,你分别有get和set,所以它会填充。

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

我尝试了这个帖子中的许多答案,但没有一个对我有用。然后我在一个类似的帖子中看到了这个答案:https://stackoverflow.com/a/40853424/2120023,他提到HttpContext. request . body,所以另一个搜索,我发现这个https://stackoverflow.com/a/1302851/2120023给了我HttpContext。当前,所以我终于得到了这个工作使用:

HttpContext.Current.Request.Form.Get("value");

邮差的要求:

curl --location --request POST 'https://example.com/token' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'value=test'