2012-02-24 14 views
16

Estoy creando un RestSharp.RestRequest a través de:¿La sobreescritura de RestSharp configura 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); 

(El Content-Type se ajusta manualmente a application/someContentType)

En el modo de depuración también muestra Content-Type=application/someContentType

Pero la ejecución de la RestRequest devuelve un 415 Media Not Supported -Error y WireShark muestra que Media-Type se establece en text/xml (como se establece en AddParameter-Method).

¿Por qué RestSharp muestra un Content-Type diferente luego WireShark? ¿Y cómo puedo evitar que se cambie el tipo de contenido (si es así)?

+5

¿Por qué no utiliza su 'application/someContentType' en' AddParameter() '? – svick

Respuesta

20

El comentario de svick es correcto. Establezca el tipo de contenido en el primer parámetro de AddParameter() y puede omitir la llamada AddHeader().

Si bien esa es la respuesta "correcta", explicaré por qué tiene un método confuso para hacer esto que no es exactamente obvio.

La forma prevista de lograr esto es usar AddBody() junto con RestRequest.RequestFormat. Un ejemplo:

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 serialización de objectToSerialize se basa en la XmlSerializer registrado. Si usa RequestFormat = DataFormat.Json, entonces se usa RestClient.JsonSerializer. Las implementaciones de ISerializer (que puede usar para anular la serialización predeterminada) declaran sus propios tipos de contenido, que es lo que pasa a través de la sobrecarga jodiosa AddParameter() que está utilizando.

AddParameter(contentType, content, ParameterType.RequestBody) nunca debe llamarse directamente. Se agregó como una solución alternativa para pasar los datos desde AddBody(), pero luego otras cosas se volvieron dependientes de ella, por lo que se mantuvo. Fue una decisión terrible en retrospectiva, pero es demasiado tarde para cambiarla en la línea de la versión 1xx. Si alguna vez construyo otra versión, lo haré más obvio.

+2

Si no está destinado a ser utilizado, puede marcarlo como Obsoleto, para que los programas existentes puedan seguir funcionando, pero ya no aparece en Intellisense, esto evitaría que la mayoría de los usuarios lo llamaran en su propio código. – Stephanvs

+0

No creo que sea demasiado obsoleto. Agregar un atributo '[System.ComponentModel.EditorBrowsable (System.ComponentModel.EditorBrowsableState.Never)]' podría ser un medio feliz (?). –

+0

No quiero cambiar nada porque es una solución bien publicitada a otro problema. –

1

Es posible cambiar el tipo de contenido cuando configura el contenido del cuerpo. El parámetro NAME para Body establece el tipo de contenido.

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