214

自从升级到 RC for WebAPI 后,我在我的 WebAPI 上调用 POST 时遇到了一些真正奇怪的问题。我什至回到了新项目生成的基本版本。所以:

public void Post(string value)
{
}

并从 Fiddler 调用:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

当我调试时,永远不会分配字符串“值”。它总是为NULL。有人有这个问题吗?

(我第一次看到更复杂类型的问题)

该问题不仅与 ASP.NET MVC 4 绑定,RC 安装后的全新 ASP.NET MVC 3 项目也会出现同样的问题

4

41 回答 41

114

我今天一直在为此挠头。

我的解决方案是将 更改[FromBody]HttpRequestMessage,本质上是向上移动 HTTP 堆栈。

在我的情况下,我通过压缩 json 的线路发送数据,然后是 base64'd。这一切都来自一个安卓应用程序。

我的 Web 端点的原始签名如下所示(使用[FromBody]):

我原来的端点

我对这个问题的解决方法是恢复使用 aHttpRequestMessage作为我的端点的签名。

在此处输入图像描述

然后,您可以使用以下代码行访问帖子数据:

在此处输入图像描述

这有效并允许您访问原始未触及的帖子数据。您不必弄乱提琴手在字符串的开头放置一个 = 符号或更改内容类型。

顺便说一句,我首先尝试遵循上述答案之一,即将内容类型更改为:“Content-Type: application/x-www-form-urlencoded”。对于原始数据,这是一个不好的建议,因为它会去掉 + 字符。

所以一个像这样开头的base64字符串:“MQ0AAB+LCAAAAAA”最终会像这样“MQ0AAB LCAAAAAA”!不是你想要的。

使用的另一个好处HttpRequestMessage是您可以从端点内访问所有 http 标头。

于 2014-08-05T17:04:06.980 回答
108

由于您只有一个参数,您可以尝试使用[FromBody]属性来装饰它,或者更改方法以接受具有值作为属性的 DTO,正如我在这里建议的那样:MVC4 RC WebApi parameter binding

更新:官方 ASP.NET 网站今天更新了一个很好的解释:https ://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

简而言之,当在正文中发送单个简单类型时,只发送以等号 (=) 为前缀的值,例如正文:

=test

于 2012-06-11T19:05:37.163 回答
72

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

尝试Content-Type在您的 POST 请求中包含一个标头。

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

或者,根据下面的评论,您可能需要包含 JSON 标头

Content-Type: application/json
于 2012-10-23T12:30:20.407 回答
60

我也遇到了这个问题,这就是我解决问题的方法

网络API代码:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

客户端代码:

$.post( "webapi/address", { value: "some value" } );
于 2013-10-21T18:03:29.670 回答
46

我正在使用Postman并且我做同样的错误..传递valueas json 对象而不是字符串

{
    "value": "test"
}

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

因此,只需在 api 正文中用双引号传递字符串:

"test"
于 2017-03-05T14:29:39.033 回答
19

尝试创建一个类作为数据模型,然后发送一个 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]and[FromUrl]属性,但使用[FromBody] string value仍然对我不起作用。似乎他们仍在解决很多错误,所以我相信这在未来会改变。

编辑: 让 XML 在正文中工作。默认 XML 序列化程序已更改为 DataContractSerializer 而不是 XmlSerializer。将以下行放入我的 Global.asax 文件中解决了这个问题(参考

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
于 2012-07-05T07:15:56.733 回答
17

经过一些尝试,我认为默认行为是正确的,没有什么可以破解的。

唯一的技巧是:如果您的 post 方法参数string如下所示,您应该在正文中发送一个带有双引号的纯字符串(使用 ajax 或 postman 时),例如,

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

否则,如果您在帖子正文中发送一个没有外部双引号和转义内部引号的 json 字符串,那么它应该能够被解析为模型类(参数类型),例如,{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}
于 2017-12-24T11:28:24.060 回答
13

我一直在寻找这个问题的解决方案几分钟,所以我将分享我的解决方案。

如果您发布模型,您的模型需要有一个空/默认构造函数,否则显然无法创建模型。重构时要小心。;)

于 2015-04-20T13:00:54.240 回答
11

对于那些像我一样对SwaggerPostman有同样问题的人,如果您在帖子中将简单属性作为字符串传递,即使指定了“ContentType”,您仍然会得到一个空值。

只是通过:

我的价值

将作为 null 进入控制器。

但如果你通过:

“我的价值”

值会正确。

引用在这里有所作为。当然,这仅适用于 Swagger 和 Postman。例如,在使用 Angular 的前端应用程序中,这应该由框架自动解决。

于 2016-11-26T11:48:24.097 回答
10

这对我有用:

  1. 创建一个 C# DTO 类,为要从 jQuery/Ajax 传递的每个属性创建一个属性

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
    
  2. 定义 web api 方法:

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
    
  3. 像这样调用 web api:

    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) {
            ...
        }
    });
    
于 2016-03-21T16:24:08.840 回答
6

我遇到了同样的问题,发现将内容类型更改为“application/json”时并没有解决问题。但是“application/json; charset=utf-8”起作用了。

于 2013-07-12T15:23:53.953 回答
4

我有一个类似的问题,我的 Web API 方法的请求对象始终为空。我注意到由于控制器操作名称以“Get”为前缀,Web API 将其视为 HTTP GET 而不是 POST。重命名控制器操作后,它现在按预期工作。

于 2013-08-09T13:32:56.953 回答
3

使用 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({..: ..., .. : ... })

于 2015-07-03T00:11:16.317 回答
3

在我的情况下,问题是参数是字符串而不是对象,我将参数更改为 Newsoft.Json 的 JObject 并且它可以工作。

于 2016-02-14T09:52:37.793 回答
3

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

  1. 安装Microsoft.AspNet.WebApi.Tracing
  2. 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)
于 2016-10-29T10:36:39.620 回答
2

添加行

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

到 Global.asax.cs 中的函数结束protected void Application_Start()在 ASP.NET MVC3 中为我修复了类似的问题。

于 2012-06-11T16:48:51.113 回答
2

如果您将DataContractSerializer用于您的 Xml 格式化程序或 JSON 格式化程序,则需要摆脱它。我在我的 WebApiConfig 文件中有这个:

public static void Register(HttpConfiguration config)
{
     config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
     );    

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

只需我注释掉jsonFormatter.UseDataContractJsonSerializer = true;,我的输入参数就不再为空了。感谢'Despertar'给我一个线索。

于 2015-07-31T00:42:55.530 回答
2

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

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

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

于 2016-11-24T16:04:31.043 回答
2

我有同样的问题,将 null 作为参数,但它与大对象有关。原来问题与 IIS 最大长度有关。可以在 web.config 中配置。

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

我想知道为什么 Web API 会抑制错误并将空对象发送到我的 API。我使用 Microsoft.AspNet.WebApi.Tracing 发现了错误。

于 2017-11-22T22:57:21.227 回答
1

我知道这不是这个问题的答案,但我在寻找我的问题的解决方案时遇到了它。

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

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
    }
}
于 2012-09-08T14:03:30.717 回答
1

我在 Fiddler 中遇到了同样的问题。我已经有Content-Type: application/json; charset=utf-8Content-Type: application/json在请求标头中。

我的请求正文也是一个普通字符串,在 Fiddler 中我写过:{'controller':'ctrl'}. 这使得我的 POST 方法中的字符串参数成为null.

修复:记得使用引号,从而表示一个字符串。也就是说,我通过编写来修复它"{'controller':'ctrl'}"。(注意:在编写 JSON 时,请务必使用撇号或转义引号,如下所示:)"{\"controller\":\"ctrl\"}"

于 2015-04-13T19:45:01.253 回答
1

我发现处理传递给 MVC 6 的简单 JSON 对象的最简单方法是获取 post 参数的类型,如 NewtonSoft jObject:

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}
于 2016-09-07T13:48:30.980 回答
1

对我来说最好的解决方案是使用完整的 HTTP,如下所示:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

然后将字符串反序列化为您期望在帖子正文中的对象。对我来说,WS_OpenSession 是一个包含 sessionid、user 和 key 的类。

您可以从那里使用 param 对象并访问其属性。

非常非常有效。

我确实说过来自这个网址:

http://bizcoder.com/posting-raw-json-to-web-api

于 2016-10-09T23:36:15.390 回答
1

我参加聚会有点晚了,但是任何偶然发现在使用控制器时传递的 NULL 值的人只需将“=”添加到您的 POST 请求的前面。

当我使用application/json Content-Type 时,控制器还传递了一个 NULL 值。请注意下面的“application/x-www-form-urlencoded”内容类型。然而,API 的返回类型是“application/json”。

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }
于 2017-01-23T07:14:28.520 回答
1

您希望发布的值类型无关紧要,只需将其括在引号内,即可将其作为字符串获取。不适用于复杂类型。

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;
        }
    }
于 2017-05-26T19:06:39.963 回答
1

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

我遇到了同样的问题,我的 DTO 即将为空。我发现原因是其中一个属性指向一个无法序列化的对象:(这导致媒体格式化程序无法解析数据。因此该对象始终为空。希望它也对其他人有所帮助

于 2017-08-25T02:38:37.077 回答
1

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

如果你有这样的json:

{
    "shoeSize": 10.5
}

但您的 c# 模型如下所示:

class Shoe{
    public int shoeSize;
}

模型绑定器将拒绝模型,您将获得空值。

于 2017-09-23T04:27:34.520 回答
1

我对此已经很晚了,但是遇到了类似的问题,经过一天的时间在这里经历了很多答案并获得了背景,我找到了将一个或多个参数传回 Web API 2 Action 的最简单/轻量级的解决方案,如下所示如下:

这假设您知道如何使用正确的路由设置 Web API 控制器/操作,如果不参考:https ://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with -aspnet-web-api/tutorial-your-first-web-api

首先是Controller Action,这个解决方案还需要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 还允许您动态迭代传入的所有参数,以便在您的参数随时间变化时更容易扩展。希望这可以帮助像我一样挣扎的人。

于 2017-12-14T10:23:58.660 回答
1

在 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,即使这发生在对象层次结构的深处。

于 2019-01-22T12:54:35.907 回答
1

JSON.stringify(...) 解决了我的问题

于 2019-05-22T15:35:32.723 回答
0

正确将正文中的单个参数传递给 WebAPI 可以使用此代码$.post(url, { '': productId }

并在行动中抓住它[HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

关键是使用神奇的词“价值”。它也可能是 int 或一些原始类型。无论是内容类型还是标题更正 混乱是此代码在 mvc 发布操作中不起作用。

于 2015-08-04T08:08:35.730 回答
0

问题是您的操作方法需要一个简单的类型,即字符串参数值。你提供的是一个对象。

您的问题有 2 个解决方案。

  1. 创建一个具有“ value ”属性的简单类,然后将该类用作参数,在这种情况下,Web API 模型绑定将从请求中读取 JSON 对象并将其绑定到您的参数对象“values”属性。

  2. 只需传递字符串值“ test ”,它就会起作用。

于 2017-08-23T07:49:13.387 回答
0

接口:

[HttpPost]
public bool UpdateTicketStatus(Ticket t)
{    
    string Id=t.Id;
}

模型:

public class Ticket
{
    public int Id { get; set; }
    public string AssignedTo { get; set; }
    public string State { get; set; }
    public string History { get; set; }
}

使用 Post man 工具将内容作为带有原始数据的 json 发送,如下所示。有用

{ "Id":"169248", "AssignedTo":"xxxx", "State":"Committed", "History":"test1" }

请确保您已启用 Cors。

[EnableCors(origins: "*", headers: "*", methods: "*")]
    public class TicketController : ApiController
    {
}
于 2017-08-26T03:26:39.563 回答
0

[JsonObject(MemberSerialization.OptOut)]在我的例子中,用Newtonsoft的属性装饰参数类就可以了。

例如:

[HttpPost]
[Route("MyRoute")]
public IHttpActionResult DoWork(MyClass args)
{
   ...
}

[JsonObject(MemberSerialization.OptOut)]
public Class MyClass
{
    ...
}
于 2017-10-18T14:08:33.960 回答
0

如果你在 Postman 的 json 查询中有这个字符 '\',如果你需要 json 字符串值中的字符 '\',你应该转义它。

例子:

{
    "path": "C:\\Users\\Test\\Documents\\test.txt"
}
于 2018-04-30T15:24:27.167 回答
0

希望这可以帮助。

查看不同的评论和其他论坛,我混合了一些片段,对我来说,这段代码有效......

...在控制器中

public HttpResponseMessage Post([FromBody] string jsonData)
    {
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, jsonData);            

        try 
        {
            string jsonString = jsonData.ToString();
            JArray jsonVal = JArray.Parse(jsonString) as JArray;
            dynamic mylist= jsonVal;
            foreach (dynamic myitem in mylist)
            {
                string strClave=string.Empty;
                string strNum=string.Empty;
                string strStatus=string.Empty;

                strClave = myitem.clave;
                strNum=myitem.num;
                strStatus = myitem.status; 
            }

...在 WebApiConfig.cs 中包含这一行以避免 [FromBody] 变量中的空值var jsonFormatter = config.Formatters.OfType().First();

public static void Register(HttpConfiguration config)
    { 
            config.Routes.MapHttpRoute(
                            name: "DefaultApi",
                            routeTemplate: "api/{controller}/{id}",
                            defaults: new { id = RouteParameter.Optional }
                        );
            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();  /*this line makes no more null when use [FromBody]*/
}

....在客户端,最重要的是在序列化数据之前连接等号( string json = "=" + SerialData;

对于我正在使用的序列化

System.Web.Script.Serialization.JavaScriptSerializer serializer = new 
System.Web.Script.Serialization.JavaScriptSerializer();

        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row;
        foreach (DataRow dr in DsCnx.Tables[0].Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn col in DsCnx.Tables[0].Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }
            rows.Add(row);
        }
        SerialData= serializer.Serialize(rows);
       PostRequest("http://localhost:53922/api/Demo", SerialData);

这是我的 PostRequest 函数,这里我使用的内容类型是httpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";

private static string PostRequest(string url, string SerialData)
    {         
        string result = String.Empty;
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
        httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = "=" + SerialData;  
            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }
        try
        {
            using (var response = httpWebRequest.GetResponse() as HttpWebResponse)
            {
                if (httpWebRequest.HaveResponse && response != null)
                {
                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        result = reader.ReadToEnd();
                    }
                }
            }
        }
        catch (WebException e)
        {
            if (e.Response != null)
            {
                using (var errorResponse = (HttpWebResponse)e.Response)
                {
                    using (var reader = new StreamReader(errorResponse.GetResponseStream()))
                    {
                        string error = reader.ReadToEnd();
                        result = error;
                    }
                }

            }
        }

        return result.ToString();

    }

这是我找到一个供参考的代码示例的链接:

https://weblog.west-wind.com/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing#jobject-and-jarray-in-aspnet-web-api

https://blog.codenamed.nl/2015/05/12/why-your-frombody-parameter-is-always-null/

于 2019-01-04T16:52:45.167 回答
0

我知道 OP 最初发送的是单个字符串,但为了将来参考,还值得注意的是,格式错误的 JSON 也会像nullpost 方法一样到达。就我而言,两个属性之间缺少逗号会导致原本很好的东西中断。

于 2020-02-12T11:18:52.370 回答
-1

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

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'
于 2020-06-10T19:39:04.657 回答
-1

有一天我遇到了和你一样的问题,就我而言,问题是,我用作 json 容器的类没有 get 和 set 定义,所以 API 不知道如何填充 JSON数据到实例中。

我的示例 json 类将是 .

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

如您所见,您分别拥有 get 和 set ,所以它会被填满。

如果您删除它们,您将获得创建该类的空实例的帖子。

于 2021-04-11T10:07:28.570 回答
-1

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

此处描述了增加请求大小的方法:https ://stackoverflow.com/a/16403447

于 2021-09-14T13:39:56.823 回答
-3

这个链接帮助了我:http ://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

基本上它说您应该为参数使用空名称:

public string Post([FromBody]string myParameter){ 
...
}  

$.post("/api/dosomething", { '' : "myvalue" });
于 2015-12-09T16:26:02.420 回答