2013-05-10 11 views
5

Ho un servizio API Web che sto tentando di accedere tramite la console utilizzando RestSharp. Il mio codice RestSharp simile a questo:Chiamate API Web con RestSharp - antepone l'applicazione/json al corpo causando un parametro null sull'azione

  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) 

mia azione Web API prende un modello che ha gli stessi parametri del modello di cui sopra. Quando la chiamata viene eseguita, l'associazione fallisce e il parametro è nullo. Ho il sospetto che questo è dovuto al metodo RestRequest.AddBody anteponendo application/json al valore corpo come illustrato di seguito:

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

Se pubblico utilizzando Fiddler il corpo si lega al modello in modo corretto. Sotto è il valore corpo ho fornito in Fiddler:

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

noti che il valore corpo suonatore è lo stesso con l'eccezione del anteponendo la chiave di applicazione/json.

anche da notare: Ho provato quello che sembra come tutto ... Ho separato i parametri in azione, usato FromBody e attributi FromUri, provato personalizzati DictionaryModelBinder di, provato ValueBinders personalizzati, provato a cambiare il modo in cui I' m usando RestSharp (AddParameter con un parametro RequestBody, AddObject, diversi stili di URL, ecc.).

Qualcun altro l'ha incontrato e, in caso affermativo, l'ha risolto? Ho scelto l'API Web per questo servizio con la speranza che l'associazione modello funzionasse come in MVC, ma sto vedendo che non è il caso.

Grazie

EDIT (risolto): RestSharp utilizza automaticamente il JsonSerializer per gli oggetti passati nel metodo ADDBODY. Ho pensato che mi mancava qualcosa di semplice, e infatti ero ... Aggiungendo il parametro Method.Post all'istanza di RestRequest risolvo il problema.

risposta

6
  1. specificare il metodo durante la creazione della richiesta:

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

  2. Non

    sicuro di quello che il serializzatore predefinito è per il corpo - si può provare a fare è esplicito:

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

  3. Non sono sicuro da dove provenga l'applicazione/json - questo è il Conte intestazione di tipo nt che dovresti inviare con la tua richiesta, sicuramente non parte del corpo. Quindi, fare questo, invece:

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

  4. Se questo non risolve il problema, provare a fare il codice come simile all'esempio sul loro sito il più possibile. Prova a rimuovere la complessità (anche se questo significa modificare la funzionalità richiesta) - portarlo a un punto in cui funziona e creare funzionalità aggiuntive.

http://restsharp.org/

+0

RestSharp utilizza automaticamente la JsonSerializer per oggetti passati nel metodo ADDBODY. Ho pensato che mi mancava qualcosa di semplice, e infatti ero ... Aggiungendo il parametro Method.Post all'istanza di RestRequest risolvo il problema. Grazie. –