2017-02-21 26 views
0
  • RestSharp 105.2.3
  • WebAPI 2

Так что я простой контроллер WebAPI как таковой:RestSharp вызова мой параметр WebAPI пустым

public class EnettController : ApiController 
{ 
    private readonly DebitService _EnettService; 

    public EnettController() 
    { 
     _EnettService = new DebitService(); 
    } 

    [HttpPost] 
    public ProcessDirectDebitResponse ProcessDirectDebit([FromBody] ProcessDirectDebitRequest aRequest) 
    { 
    } 
} 

и из моего тестового жгута I позвоните ему со следующим кодом RestSharp:

RestClient client = new RestClient($"http://{txtHost.Text}:{txtPort.Text}"); 

ProcessDirectDebitRequest dataForRequest = new ProcessDirectDebitRequest 
              { 
               AgentId = "James Bond", 
               DepartureDate = DateTime.Now, 
               Version = "123" 
              }; 

RestRequest request = new RestRequest("api/Enett", Method.POST) 
         { 
          RequestFormat = DataFormat.Json 
         }; 
request.AddHeader("Accept", "application/json"); 
request.AddHeader("Content-Type", "application/json; charset=utf-8"); 
request.AddBody(dataForRequest); 

IRestResponse<ProcessDirectDebitResponse> response = client.Execute<ProcessDirectDebitResponse>(request); 

if (response.StatusCode != HttpStatusCode.OK) 
{ 
    MessageBox.Show($"Did not yet a 200 response. Got instead {response.StatusCode}"); 
} 

В моей конечной точке WebAPI нет проблем, но aRequest всегда имеет значение NULL. Так что я упускаю что-то очевидное здесь, я просто не вижу, что это такое. Почему aRequest всегда имеет значение NULL?

+0

Кажется, будет хорошо на первый взгляд. Можно ли проверить загрузку запроса, используя скрипт или аналогичные инструменты? Возможно, вы также можете попробовать 'request.AddJsonBody (dataForRequest);' – Developer

+0

AddJsonBody() не имеет значения. Все еще пытаюсь заставить Скрипача увидеть запрос. – TheEdge

+0

Правильно, не должно иметь значения; просто хочу удостовериться, что при установке Content-Type не было никакой опечатки. Должен получить некоторую информацию, если вы посмотрите на полезную нагрузку и заголовки запроса. – Developer

ответ

0

вопрос здесь оказался, что класс ProcessDirectDebitRequest был оформлен в виде [Serializable] приводит к следующей полезной нагрузки время ожидается:

{ 
    "<AgentId>k__BackingField": "sample string 1", 
    "<DepartureDate>k__BackingField": "2017-02-22T12:01:25.8332359+11:00", 
    "<Version>k__BackingField": "sample string 3" 
} 

вместо того, что то, что ожидалось, что было:

{ 
    "AgentId": "sample string 1", 
    "DepartureDate": "2017-02-22T12:01:25.8332359+11:00", 
    "Version": "sample string 3" 
} 

Есть несколько способов обойти эту проблему, в зависимости от ваших потребностей:

  1. Не украшайте [Serialize]
  2. Используйте config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); // Удаление отступающие поля и держать [Serialize]
  3. использовать Прямо [DataContract], [DataMember]