2016-11-17 5 views
1

У меня есть простой веб-api, но когда я тестирую его с помощью Postman, параметр метода равен нулю. Я просматривал и другие вопросы с похожим названием, но я не нашел ответа.web api: параметр действия null

Вот мой контроллер действия:

[HttpPost] 
    public Member Create([FromBody] string payload) 
    { 
     var s = Request.Content.ReadAsStringAsync(); 

     if (payload == null) 
     { 
      throw new ArgumentNullException(nameof(payload)); 
     } 

     Console.WriteLine(payload); 
     Console.WriteLine(s); 

     return null; 
    } 

А вот моя конфигурация Почтальон: enter image description here

На вкладке заголовков я добавил content-type быть application/json.

, когда я отладки это, переменная payload всегда находится null и строка s содержит что-то вроде

Id = 98, Status = RanToCompletion, Method = "{null}", Result = "" 

Так, что я делаю не так?

+1

Что происходит, когда вы просто помещаете строку (без JSON) в тело? – Donal

+0

Прочитайте это, и вы сделаете ошибку с привязкой параметров. [Связывание параметров в веб-интерфейсе ASP.NET] (https://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api) Другая ошибка заключается в том, что вы выводите задачу, а не результат задачи при попытке прочитать содержимое в виде строки – Nkosi

+0

@Donal Если я помещаю простую строку, она работает. Но почему? –

ответ

0

Вы должны обернуть строку в модели (объекта):

class Model 
{ 
    public string payload {get;set;} 
} 

[HttpPost] 
public async Task<Member> Create([FromBody] Model model) // wrap Member in Task and add async keyword 
{ 
    var s = await Request.Content.ReadAsStringAsync(); // add await here 

    if (model.payload == null) 
    { 
     throw new ArgumentNullException(nameof(model.payload)); 
    } 

    Console.WriteLine(model.payload); 
    Console.WriteLine(s); 

    return null; 
} 

Если вы не хотите использовать модель, попробуйте отправить только обычную строку, например "some payload", не оберните ее в json.

+0

но почему? Я не вижу логики –

+0

@BudaGavril на основе вашего почтальона. Тело запроса показывает, что вы отправляете json-объект (сложную модель), а не строку, которая является ожидаемым действием – Nkosi

+0

@BudaGavril, потому что 'json' нуждается в модель в контроллере. Вы отправляете 'json', а не просто строку' string' –

1

Буда,

HttpContent.ReadAsStringAsync возвращает Task<string>, следовательно, значение s строки.

Вы должны обновить свои действия, чтобы сделать его ASync:

[HttpPost] 
public async Task<Member> Create([FromBody] string payload) 
{ 
    var s = await Request.Content.ReadAsStringAsync(); 

    if (payload == null) 
    { 
     throw new ArgumentNullException(nameof(payload)); 
    } 

    Console.WriteLine(payload); 
    Console.WriteLine(s); 

    return null; 
} 
+0

Я обновил код и использовал его, но моя переменная s содержит string.Empty –

+0

's' пуст, потому что указатель потока содержимого уже находится в конце потока, поскольку среда уже прочитала его, пытаясь заполнить параметр – Nkosi

Смежные вопросы