Не удается заставить RestSharp отправить параметр объекта в контроллер веб-API (всегда ноль)? - PullRequest
0 голосов
/ 25 января 2019

У меня есть простой метод контроллера, подобный этому:

public IEnumerable<IEntity> GetEntities(ParamsModel args)
{
   //set break point here to examine the args
   return null;
}

А вот мой ParamsModel:

public class ParamsModel {
   public string Test;
}

А вот метод моего клиента для отправки запроса на получение:

//_client here is an instance of RestClient
public async Task<IEnumerable<T>> GetEntitiesAsync()
{
   var request = new RestRequest("somePath");
   var o = new {                
            Test = "OK"
           };
   request.AddJsonBody(o);       
   return await _client.GetAsync<List<T>>(request);       
}

После запуска метода GetEntitiesAsync достигается точка останова (в методе контроллера).Однако args является нулем, правда?

Я также попробовал следующее:

public async Task<IEnumerable<T>> GetEntitiesAsync()
{
   var request = new RestRequest("somePath");
   request.AddParameter("Test", "OK");
   return await _client.GetAsync<List<T>>(request);       
}

Однако это не сработало (args равно нулю в методе контроллера).Если я изменю метод контроллера на что-то вроде этого (и использую клиентский код, как показано выше), я вижу, что единственный простой аргумент строки имеет значение, анализируемое OK ("OK") внутри метода контроллера:

public IEnumerable<IEntity> GetEntities(string Test)
{
   //here we can see that Test has value of "OK"
   return null;
}

На самом деле я не понимаю, что не так с моим кодом.На самом деле я работал с RestSharp по крайней мере год назад, но теперь, похоже, появились новые методы (такие как GetAsync, как я использовал в своем коде), как и раньше, я использовал Execute и ExecuteAsync.

Не могли бы вы заметить здесь что-то не так?Спасибо!

PS: я пользуюсь RestSharp 106.6.7

1 Ответ

0 голосов
/ 25 января 2019

Обновить действие, чтобы явно указывать, где искать и связывать данные, используя [FromUri]

public IHttpActionResult GetEntities([FromUri]ParamsModel args) {

    //...

    return Ok(entities);
}

Чтобы заставить Web API читать сложный тип из URI, добавьте атрибут [FromUri] к параметру.

Ссылка Связывание параметров в ASP.NET Web API

Пример с AddParameter

public async Task<IEnumerable<T>> GetEntitiesAsync() {
   var request = new RestRequest("somePath");
   request.AddParameter("Test", "OK");
   return await _client.GetAsync<List<T>>(request);       
}

Должен работать сейчас.

Обратите внимание, что модель должна использовать свойства вместо полей

public class ParamsModel {
   public string Test { get; set; }
}
...