it-roy-ru.com

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

После обновления до 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

184
ianrathbone

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

ОБНОВЛЕНИЕ: Официальный сайт ASP.NET был обновлен сегодня с отличным объяснением: http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part -1

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

=test

94
Jim Harte

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

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

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

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

My original endpoint

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

enter image description here

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

enter image description here

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

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

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

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

94
Ocean Airdrop

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

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

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

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

Content-Type: application/json
68
Kirk Broadhurst

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

код вебапи:

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

код клиента:

$.post( "webapi/address", { value: "some value" } );
48
George

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

{
    "value": "test"
}

Ясно, что приведенный выше являетсянеправильно, когда параметр API имеет тип строки.

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

"test"
32
JerryGoyal

Попробуйте создать класс, который будет служить моделью данных, а затем отправьте объект 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 у меня все равно не сработало. Похоже, они все еще исправляют множество ошибок, поэтому я уверен, что это изменится в будущем.

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

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
18
Despertar

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

Единственный прием: если ваш аргумент метода 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"
}
12
Leon

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

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

11
chrjs

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

  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) {
            ...
        }
    });
    
5
BigMan73

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

5
byobgyn

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

4
Richard Pursehouse

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

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

MyValue

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

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

"MyValue"

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

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

4
dvc.junior

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

3
syb

Если вы уверены в своем отправленном 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)
2
Mohsen Afshin

Если вы используете 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
Amir Chatrbahr

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

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

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

2
Sergey Kudriavtsev

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

2
Yogi

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

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

Лучшее решение для меня - полный 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

1
albertdadze

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

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

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

1
mohghaderi

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

В моем случае сложный тип не был связан, но я не делал 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
    }
}
1
danludwig

Я довольно поздно опоздал, но у меня были похожие проблемы, и после дня, когда я разобрался со многими ответами и получил базовый опыт, я нашел самое простое и легкое решение для передачи одного или нескольких параметров в 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 также позволяет вам динамически перебирать все передаваемые параметры, обеспечивая более легкую масштабируемость, если ваши параметры изменяются со временем. Надеюсь, это поможет кому-то, кто боролся, как я.

1
Nathan

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

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

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

1
jaiveeru

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

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}
1
Pini Cheyni

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

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

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

1
eightx2

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

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
Opochitsky Dimitry

Если у вас есть этот символ '\' в вашем запросе json в Postman, вы должны его избежать, если вам нужен символ '\' в строковом значении json.

Пример:

{
    "path": "C:\\Users\\Test\\Documents\\test.txt"
}
0
Gregory

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

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

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

0
Lapenkov Vladimir

В моем случае украшение класса параметров с атрибутом [JsonObject(MemberSerialization.OptOut)] от Newtonsoft добилось цели. 

Например:

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

[JsonObject(MemberSerialization.OptOut)]
public Class MyClass
{
    ...
}
0
jellojam

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

0
ragnarswanson

API:

[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
    {
}
0
user3007071

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

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

{
    "shoeSize": 10.5
}

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

class Shoe{
    public int shoeSize;
}

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

0
TwitchBronBron

Встречался с подобной проблемой в ASP.NET Core, а другой возможной причиной является сбой привязки ASP.NET (без вывода сообщений) по различным причинам, таким как отправка нулевого значения для привязки к ненулевому свойству :

{
    "prop1":1139357,
    "prop2":1139356,

    "items":[
        {"key":"15","someprop":34,"notnullprop":null},
        {"key":"16","someprop":34,"notnullprop":null},
        {"key":"22","someprop":34,"notnullprop":null}]
}

В этом случае исключение не выдается, и вся модель будет нулевой , даже если это происходит глубоко внутри иерархии объектов.

0
Alexei

Надеюсь это поможет.

Просматривая различные комментарии и другие форумы, я смешиваю некоторые фрагменты, и для меня этот код работает ...

... в контроллере

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/

0
Victor Medel

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

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

0
Has AlTaiar

Проблема заключается в том, что ваш метод действия ожидает простой тип, то есть значение строкового параметра. То, что вы предоставляете, является объектом. 

Есть 2 решения вашей проблемы.

  1. Создайте простой класс со свойством « value », а затем используйте этот класс в качестве параметра, и в этом случае привязка модели Web API будет считывать объект JSON из запроса и связывать его со свойством «значения» вашего параметра param.

  2. Просто передайте строковое значение " test ", и оно будет работать.

0
Deepak Pathak