2012-02-24 9 views
16

Sto creando un RestSharp.RestRequest tramite:La sovrascrittura di RestSharp imposta manualmente Content-Type?

RestRequest request = new RestRequest(); 
request.Method = Method.POST; 
request.Resource = "/rest-uri"; 

request.AddHeader("Content-Type", "application/someContentType"); 

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine + 
      "<register-request">" + Environment.NewLine + 
      " <name=\"someName\"/>" + Environment.NewLine + 
      "</register-request>"); 

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody); 

(Il Content-Type è impostato manualmente application/someContentType)

In modalità debug mostra anche Content-Type=application/someContentType

Ma l'esecuzione della RestRequest restituisce un 415 Media Not Supported -Errore e WireShark indica che il Tipo di supporto è impostato su text/xml (come impostato nel metodo AddParameter).

Perché RestSharp mostra un diverso tipo di contenuto, quindi WireShark? E come posso impedire che il tipo di contenuto venga modificato (se lo è)?

+5

Quindi perché non si utilizza l'applicazione/someContentType in? AddParameter() '? – svick

risposta

20

Il commento di svick è giusto. Impostare il tipo di contenuto nel primo parametro di AddParameter() e si può tralasciare la chiamata AddHeader().

Mentre questa è la risposta "giusta", spiegherò perché ha un metodo confuso per fare ciò che non è esattamente ovvio.

Il modo previsto per eseguire questa operazione è utilizzare AddBody() insieme a RestRequest.RequestFormat. Un esempio:

var client = new RestClient(); 
// client.XmlSerializer = new XmlSerializer(); // default 
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer 

var request = new RestRequest(); 
request.RequestFormat = DataFormat.Xml; 
request.AddBody(objectToSerialize); 

La serializzazione di objectToSerialize si basa sulla XmlSerializer registrati. Se si utilizza RequestFormat = DataFormat.Json, viene utilizzato lo RestClient.JsonSerializer. Le implementazioni di ISerializer (che è possibile utilizzare per sovrascrivere la serializzazione predefinita) dichiarano i propri Content-Types che è ciò che viene passato attraverso il sovraccarico janky AddParameter() che si sta utilizzando.

AddParameter(contentType, content, ParameterType.RequestBody) non è mai stato progettato per essere chiamato direttamente. È stato aggiunto come soluzione alternativa per passare i dati da AddBody() ma poi altre cose sono diventate dipendenti da esso, quindi è rimasto bloccato. È stata una decisione terribile col senno di poi, ma è troppo tardi per cambiarla nella versione 1xx. Se mai costruissi un'altra versione lo renderò più ovvio.

+2

Se non è destinato a essere utilizzato, è possibile contrassegnarlo come Obsoleto, quindi i programmi esistenti possono continuare a funzionare, ma non vengono più visualizzati in Intellisense, questo impedirebbe alla maggior parte degli utenti di chiamarlo nel proprio codice? – Stephanvs

+0

Non penso che sia piuttosto obsoleto. Aggiungere un attributo '[System.ComponentModel.EditorBrowsable (System.ComponentModel.EditorBrowsableState.Never)]' potrebbe essere un mezzo felice (?). –

+0

Non voglio cambiare nulla perché è una soluzione ben pubblicizzata per un altro problema. –

1

È possibile modificare il tipo di contenuto quando si imposta il contenuto del corpo. Il parametro NAME per Body imposta il Content-Type.

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody }); 
Problemi correlati