Параметр сообщения всегда равен нулю

197

После обновления до RC для WebAPI у меня возникла странная проблема при вызове POST в моем WebAPI. Я даже вернулся к базовой версии, созданной для нового проекта. Так:

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, такая же проблема возникает для нового проекта ASP.NET MVC 3 после установки RC

ianrathbone
источник
Просто чтобы добавить к проблеме - это не только JSON, это также происходит с XML.
ianrathbone
3
Я боролся с этим в течение двух дней, и после прочтения каждой статьи, которую я смог найти, оказалось, что это так же просто, как правильно отформатировать строку JSON в WebRequest: данные должны начинаться и заканчиваться двойными кавычками, а если вы потом используйте одинарные кавычки в ваших данных JSON, все это играет хорошо.
Gineer

Ответы:

101

Поскольку у вас есть только один параметр, вы можете попытаться украсить его [FromBody]атрибутом или изменить метод, чтобы он принимал DTO со значением в качестве свойства, как я предложил здесь: MVC4 RC Привязка параметров WebApi

ОБНОВЛЕНИЕ: Официальный сайт ASP.NET был обновлен сегодня с отличным объяснением: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

В двух словах, при отправке одного простого типа в теле, отправьте только значение с префиксом знака равенства (=), например, body:

=test

Джим Харт
источник
9
Я сделал [FromBody] водоворот, но это не изменилось
ianrathbone
11
Передайте только значение (то есть не как объект JSON), и оно должно работать, согласно blogs.msdn.com/b/jmstall/archive/2012/04/16/…
Джим Харт
8
Приложение в начале =никогда не работало для меня, пока я не последовал совету Джима в его комментарии (не как объект JSON), и это сработало. Это ключ! Мне действительно не нравится, насколько требователен WebAPI.
gitsitgo
16
Это настолько глупо и раздражает, что я не знаю, стоит ли повышать или понижать ответ, который помог мне решить мою проблему ... С какой стати это должно быть в этом формате? (Извините за отношение, просто потратил слишком много времени на это, и это не имеет никакого смысла ... :(). Вы действительно должны добавить поддержку того формата, в котором люди ожидают его принятия.
Гдорон поддерживает Монику
6
Спасибо! Откуда нам знать, что мы должны удалить имя параметра при отправке только одного параметра? Какой птичий мозг придумал эту идею?
Дженни О'Рейли
104

Я почесал голову над этим сегодня.

Мое решение изменить [FromBody]к HttpRequestMessage, по существу , двигаясь вверх по HTTP стека.

В моем случае я посылаю данные по проводу, который является zips json, который затем base64'd. Все это из приложения для Android.

Оригинальная подпись моей веб-конечной точки выглядела так (используя [FromBody]):

Моя исходная конечная точка

Мое исправление для этой проблемы состояло в том, чтобы вернуться к использованию HttpRequestMessageдля подписи моей конечной точки.

введите описание изображения здесь

Затем вы можете получить доступ к данным поста, используя следующую строку кода:

введите описание изображения здесь

Это работает и позволяет вам получить доступ к необработанным нетронутым данным поста. Вам не нужно возиться с Fiddler, помещающим знак = в начале вашей строки или изменяющим тип контента.

Кроме того, я сначала попытался следовать одному из приведенных выше ответов, который состоял в том, чтобы изменить тип содержимого на «Content-Type: application / x-www-form-urlencoded». Для необработанных данных это плохой совет, потому что он убирает символы +.

Итак, строка base64, которая начинается примерно так: «MQ0AAB + LCAAAAAA» заканчивается так: «MQ0AAB LCAAAAAA»! Не то, что вы хотите.

Еще одним преимуществом использования HttpRequestMessageявляется то, что вы получаете доступ ко всем заголовкам http из вашей конечной точки.

Ocean Airdrop
источник
6
Отличное решение ... у меня ушло 9 часов, чтобы найти это, я решил проблему после того, как удалил строковое значение [FromBody] и заменил его на HttpRequestMessage
Kev
1
Работает как шарм! но нет ли способа использовать фактический тип параметра определенного объекта? Например, параметр типа Order для метода веб-API?
Рон Нуни
7
Просто примечание: вам НЕ НУЖДАЕТСЯ HttpRequestMessage requestв сигнатуре метода, как у вас всегда это уже есть. В теле метода можно получить доступ к Requestобъекту. напр.Request.Content.ReadAsStringAsync().Result;
Морваэль
Обычно эта проблема связана с тем, что ваш объект JSON неверен. Я обнаружил, что это всегда потому, что в конструкторе есть недопустимый тип, и Json не знает, как преобразовать его «Как Guid в строку. Так что либо добавьте конвертер через настройки, либо добавьте пустой конструктор, и вам не нужно возвращаться к старому коду, подобному этому.
Ник Тернер
Самый простой способ - это переключить объект в строку, а затем попытаться преобразовать его, и вы увидите ошибку JSON. Проверьте, что вы тоже заголовки.
Ник Тернер
71

Я только что это произошло, используя Fiddler. Проблема была в том, что я не уточнил Content-Type.

Попробуйте включить заголовок для Content-Typeв вашем запросе POST.

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

В качестве альтернативы, согласно комментариям ниже, вам может понадобиться включить заголовок JSON

Content-Type: application/json
Кирк Бродхерст
источник
11
У меня была похожая проблема, за исключением того, что мне нужно было установить Content-Type: application / json
dvallejo
2
Как указано в посте - я уже добавил Content-Type: application / json
ianrathbone
2
application / x-www-form-urlencoded не работает для меня, Content-Type: application / json сделал.
Лян
1
Независимо от типа содержимого, если у вас есть только один параметр, вы должны отправлять только значение без имени параметра в теле запроса. Так ID = 13 не будет работать. Вам нужно отправить 13 в одиночку. Смотрите ответ Джима.
Дженни О'Рейли,
Мне пришлось использовать contentType: "application/x-www-form-urlencoded; charset=UTF-8", для полного примера см. Complete Cient и Server
RyBolt
57

Я столкнулся с этой проблемой, и именно так я решил свою проблему

код вебапи:

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

код клиента:

$.post( "webapi/address", { value: "some value" } );
Джордж
источник
1
Это работает, если клиент отправляет JSON. Если я отправляю простое значение, такое как строка some value, то dataэто ноль.
Брианестей
легко, измените свой клиентский код, чтобы отправить обратно объект js.
Джордж
Отличный и чистый способ получить данные из JSON
Wouter Vanherck
Если вы отправляете json, тогда var json = JsonConvert.SerializeObject (data);
dvallejo
41

Я использовал, Postmanи я делал ту же ошибку .. передавая valueобъект как JSON вместо строки

{
    "value": "test"
}

Ясно, что вышеприведенное неверно, когда параметр api имеет тип string.

Итак, просто передайте строку в двойных кавычках в теле API:

"test"
JerryGoyal
источник
2
Это была моя проблема, и, вероятно, реальное решение вопроса. В JSON-кодированной строке есть кавычки
Кайл W
1
Я также столкнулся с этой проблемой на Почтальоне. Оказывается, я ошибочно выбрал «форма-данные» вместо «raw» для Body, когда для Content-Type установлено значение application / json. Вы можете обратиться к скриншотам zzyykk123456 в выпусках aspnet Github: github.com/aspnet/Home/issues/2202
Чунь Лин
Это сработало для меня. Используя Swagger (swashbuckle), я должен установить тип контента: application / json и использовать двойные кавычки.
Джон Хенкель
1
Именно моя проблема. Но я должен отметить, что в Ajax-запросах вы должны делать 'data: JSON.stringify ("YourString") "
Амир Хоссейн Ахмади,
1
@AmirHosseinAhmadi Я только что столкнулся с этим на ajax и увидел, что на самом деле использование JSON.stringifyзаставляет меня [frombody]быть null. После установки в поле данных строкового значения (то есть строки json) это сработало.
Nexaspx
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]и [FromUrl]атрибуты, но с использованием до [FromBody] string valueсих пор не работает для меня. Похоже, что они до сих пор исправляют множество ошибок, поэтому я уверен, что это изменится в будущем.

Изменить: Получил XML для работы в теле. Сериализатор XML по умолчанию был изменен на DataContractSerializer вместо XmlSerializer. Помещение следующей строки в мой файл Global.asax устранило эту проблему ( ссылка )

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
Деспертар
источник
у меня это работало с request.ContentType = "application / json; charset = UTF-8";
Арвинд Крмар
15

После некоторых попыток я думаю, что поведение по умолчанию правильное и взломать нечего.

Единственная хитрость: если ваш аргумент метода post stringподобен приведенному ниже, вы должны отправить обычную строку с двойными кавычками в теле (при использовании ajax или почтальона), например,

//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"
}
Леон
источник
11

Я искал решение этой проблемы уже несколько минут, поэтому поделюсь своим решением.

Если вы публикуете модель, ваша модель должна иметь пустой конструктор / конструктор по умолчанию, иначе модель не может быть создана, очевидно. Будьте осторожны при рефакторинге. ;)

chrjs
источник
Рефакторинг это именно то, что меня укусило, спасибо за совет
Алан
10

Это сработало для меня:

  1. Создайте класс C # DTO со свойством для каждого атрибута, который вы хотите передать из jQuery / Ajax

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
  2. Определите метод веб-API:

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
  3. Назовите веб-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) {
            ...
        }
    });
BigMan73
источник
Спасибо за публикацию, я попробовал множество образцов, но это сработало для меня!
Сатбир
10

Для тех, у кого такая же проблема с Swagger или Postman, как у меня, если вы передаете простой атрибут в виде строки в сообщении, даже с указанным «ContentType», вы все равно получите нулевое значение.

Проходя просто:

MyValue

Попадет в контроллер как ноль.

Но если вы пройдете:

"MyValue"

Значение станет правильным.

Цитаты сделали разницу здесь. Конечно, это только для Сваггера и Почтальона. Например, в приложении Frontend, использующем Angular, это должно решаться платформой автоматически.

dvc.junior
источник
6

У меня была та же проблема, и я обнаружил, что при изменении типа контента на «application / json» проблема не устраняется. Однако "application / json; charset = utf-8" сработало.

byobgyn
источник
Да, Web API не будет десериализован без charset = utf-8. blog.codenamed.nl/2015/05/12/…
Сэм Рюби
4

У меня была похожая проблема, когда объект запроса для моего метода Web API всегда был нулевым. Я заметил, что, поскольку в имени действия контроллера был указан префикс «Get», Web API воспринимал это как HTTP GET, а не как POST. После переименования действия контроллера оно теперь работает как задумано.

Ричард Кошелек
источник
3

С Angular я смог передать данные в этом формате:

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

А в Web API Controler:

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

Йог
источник
3

В моем случае проблема заключалась в том, что параметр был строкой, а не объектом, я изменил параметр на JObject of Newsoft.Json, и он работает.

НСБ
источник
2

Добавление строки

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

до конца функции protected void Application_Start()в Global.asax.cs исправлена ​​аналогичная проблема для меня в ASP.NET MVC3.

Сергей Кудрявцев
источник
Спасибо за помощь, но, к сожалению, это не помогло. Я буду держать линию в настоящее время, поскольку это может помочь в любом случае!
ianrathbone
Просто чтобы добавить те же проблемы возникают, когда я
публикую
2

Если вы используете DataContractSerializer для вашего Xml Formatter или JSON Formatter, вам нужно избавиться от него. У меня было это в моем файле 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» за подсказку.

Амир Чатрбар
источник
2

Если вы уверены в своем отправленном JSON, вы должны тщательно отслеживать свой API:

  1. устанавливать Microsoft.AspNet.WebApi.Tracing пакет
  2. Добавьте config.EnableSystemDiagnosticsTracing();в метод WebApiConfigвнутри класса Register.

Теперь посмотрите на вывод отладки, и вы, вероятно, найдете недействительный 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 не в правильном формате.
Хизар Икбал
2

У меня была такая же проблема получения нулевого значения, как у параметра, но это было связано с большими объектами. Оказалось, что проблема связана с максимальной длиной IIS. Это можно настроить в web.config.

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

Интересно, почему Web API подавил ошибку и отправляет нулевые объекты моим API. Я нашел ошибку с помощью Microsoft.AspNet.WebApi.Tracing.

mohghaderi
источник
2

JSON.stringify (...) решил мои проблемы

ragnarswanson
источник
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
    }
}
danludwig
источник
Это связано с тем, что при использовании GET тело запроса игнорируется (а иногда и вызывает ошибку). Причина, по которой он работает сейчас, заключается в том, что теперь вы передаете параметры в строке запроса, а ваше тело пусто, как должно быть в GET
RyBolt
1

У меня была такая же проблема в Fiddler. Я уже имел Content-Type: application/json; charset=utf-8илиContent-Type: application/json в заголовке запроса.

Мой запрос тело было также простая строка, а в Fiddler я написал: {'controller':'ctrl'}. Это сделало строковый параметр в моем методе POSTnull .

Исправление : не забудьте использовать кавычки, тем самым указав строку. То есть я исправил это письменно "{'controller':'ctrl'}". (Примечание: при написании JSON обязательно используйте апострофы или экранируйте кавычки следующим образом:) "{\"controller\":\"ctrl\"}".

gosr
источник
Я должен был сделать то же самое в Почтальоне. Но мне не нужно это делать, когда я звоню в Spring. Похоже, проблема на стороне .Net.
Малкольм МакРобертс
1

Самый простой способ, который я нашел для работы с простым JSON-объектом, который я передаю в MVC 6, - это получить тип параметра post, такой как NewtonSoft jObject:

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}
Пини Чейни
источник
Test ( [FromBody] object body, [FromHeader(Name="Content-Type")] string bodyMediaType) может работать лучше, так как проверка bodyMediaType == "application.json"перед приведением тела к JObject предоставляет возможность для альтернатив.
VladH
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 и получить доступ к его свойствам.

Очень очень эффективно.

Я сказал источник из этого URL:

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

albertdadze
источник
1

Для сложных типов Web API пытается прочитать значение из тела сообщения, используя средство форматирования медиа-типа.

Пожалуйста, проверьте, есть ли у вас [Serializable]атрибут, украшающий ваш класс модели.

Удалите атрибут, чтобы увидеть, работает ли он. Это сработало для меня.

jaiveeru
источник
1

Я немного опоздал на вечеринку, но любой, кто сталкивается с пропущенным значением NULL при использовании контроллера, просто добавляет «=» в начало вашего запроса POST.

Контроллер также передал значение NULL, когда я использовал тип содержимого application / json . Обратите внимание на тип содержимого 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;
    }
JTStuedle
источник
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;
        }
    }
Опочицкий Дмитрий
источник
1

Если вы добавили аннотацию [FromBody] и у вас есть объект Dto в качестве параметра для вашего метода, но вы все еще не можете получить данные, начните изучать свойства и поля вашего DTO.

У меня была такая же проблема, когда мой DTO обнулялся. Я обнаружил, что причина была в том, что одно из свойств указывало на объект, который не может быть сериализован :(, что приводит к тому, что медиа-форматер не может анализировать данные. Таким образом, объект всегда был нулевым. Надеюсь, что это также помогает другим

Имеет альтайар
источник
1

Дважды проверьте ваши типы данных. Связыватель модели dotnet не будет преобразовывать число с плавающей точкой в ​​целое число (и я предполагаю другие связанные понятия). Это приведет к отклонению всей модели.

Если у вас есть JSON, как это:

{
    "shoeSize": 10.5
}

но ваша модель c # выглядит так:

class Shoe{
    public int shoeSize;
}

связыватель модели отклонит модель, и вы получите ноль.

TwitchBronBron
источник
1

Я довольно поздно опоздал, но у меня возникли похожие проблемы, и после дня, проведенного здесь после получения множества ответов, я нашел самое простое / легкое решение для передачи одного или нескольких параметров в Web API 2. следующим образом:

Это предполагает, что вы знаете, как настроить контроллер / действие Web API с правильной маршрутизацией, если не обратитесь к: https://docs.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 }иначе ваше значение будет нулевым на стороне сервера.

При этом вы можете отправить один или несколько параметров в Web API в структуре JSON, и вам не нужно объявлять какие-либо дополнительные объекты на стороне сервера для обработки сложных данных. JObject также позволяет вам динамически перебирать все передаваемые параметры, обеспечивая более легкую масштабируемость, если ваши параметры изменяются со временем. Надеюсь, это поможет кому-то, кто боролся, как я.

Натан
источник
0

Корректная передача одного параметра в теле в WebAPI работает этот код $.post(url, { '': productId }

И ловить это в действии [HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

Ключ должен использовать волшебное слово «значение». Это может быть также int или некоторый примитивный тип. Независимо от типа содержимого или исправлений заголовка Беспорядок в том, что этот код не работает в пост-действии mvc.

Лапенков Владимир
источник