2013-05-10 21 views
5

Mam usługę Web API, do której próbuję uzyskać dostęp za pomocą konsoli za pomocą RestSharp. Mój kod RestSharp wygląda następująco:Wywołania Web API z RestSharp - dodaje aplikację/json do treści powodującej parametr null w działaniu

  RestClient client = new RestClient(baseUrlString); 
     RestRequest request = new RestRequest("controllername/actionname"); 
     request.RequestFormat = DataFormat.Json; 

     ProcessQuestion model = new ProcessQuestion() 
     { 
      Id = "123456", 
      InstanceId = "123", 
      UniqueId = "bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626", 
      PostedAnswer = new Dictionary<string, string>() { { "question_7907_1", "selected" }, { "question_7907_2", "selected" } } 
     }; 
     request.AddBody(model); 

     var response = client.Execute(request) 

Moja czynność w interfejsie API sieci Web ma model, który ma takie same parametry jak powyższy model. Po wywołaniu połączenie nie powiedzie się, a parametr jest pusty. Podejrzewam, że to ze względu na sposób RestRequest.AddBody poprzedzenie application/json do wartości ciała, jak pokazano poniżej:

{application/json={"Id":"123456","InstanceId":"123","UniqueId":"bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626","PostedAnswer":{"question_7907_1":"selected","question_7907_2":"selected"}}} 

Gdybym Post używając Skrzypek ciało wiąże się z modelem poprawnie. Poniżej jest wartością ciało I, pod warunkiem w Skrzypek:

{'Id':'123456','InstanceId':'123','Uniqueid':'bfb16a18-d0d6-46ab-a5b3-2f0ebbfe8626','PostedAnswer':{'question_7907_1':'selected','question_7907_2':'selected'}} 

pamiętać, że wartość ciało w Skrzypek jest taka sama, z wyjątkiem poprzedzenie klawisz application/json.

Uwaga: próbowałem czegoś, co wydaje się być wszystkim ... Rozdzieliłem parametry w akcji, użyłem atrybutów FromBody i FromUri, wypróbowałem niestandardowe DictionaryModelBinder, wypróbowałem niestandardowe ValueBinders, próbowałem zmienić sposób m przy użyciu RestSharp (AddParameter z parametrem RequestBody, AddObject, różnymi stylami URL itp.).

Czy ktoś inny to napotkał, a jeśli tak, czy rozwiązał go? Wybrałem Web API dla tej usługi z nadzieją, że modelowanie będzie działało tak jak w MVC, ale widzę, że tak nie jest.

Dzięki

EDIT (rozwiązany): RestSharp automatycznie używa JsonSerializer obiektów przekazanych w metodzie AddBody. Pomyślałem, że brakuje mi czegoś prostego, i rzeczywiście byłem ... Dodanie parametru Method.Post do instancji RestRequest rozwiązało problem.

Odpowiedz

6
  1. określić metodę podczas tworzenia żądania:

    RestRequest request = new RestRequest("controllername/actionname", Method.POST);

  2. Nie wiesz co domyślny serializer jest dla ciała - można spróbować zarówno wyraźne:

    request.AddBody(request.JsonSerializer.Serialize(model));

  3. Nie jestem pewien, skąd pochodzi "aplikacja/json" - to Conte Nagłówek nt-Type powinien być wysyłany z twoją prośbą, zdecydowanie nie jest częścią ciała. Więc to zrobić w zamian:

    request.AddHeader("Content-type", "application/json; charset=utf-8");

  4. Jeśli to nie pomoże, spróbuj kod jako podobny do przykładu na ich miejscu, jak to możliwe. Spróbuj usunąć złożoność (nawet jeśli oznacza to zmianę wymaganej funkcjonalności) - przenieś ją do punktu, w którym działa i zbuduj na niej dodatkową funkcjonalność.

http://restsharp.org/

+0

RestSharp automatycznie wykorzystuje JsonSerializer obiektów przekazywane w sposobie AddBody. Pomyślałem, że brakuje mi czegoś prostego, i rzeczywiście byłem ... Dodanie parametru Method.Post do instancji RestRequest rozwiązało problem. Dzięki. –