2012-09-24 17 views
32

En una de las solicitudes de Get, deseo devolver un HttpResponseMessage con cierto contenido. Actualmente lo tengo trabajando de la siguiente manera:Web API: contenido en HttpResponseMessage

var header = new MediaTypeHeaderValue("text/xml"); 
Request.CreateResponse(HttpStatusCode.OK, myObject, header); 

Sin embargo, dado que estoy usando la Solicitud estática, esto se vuelve realmente difícil de probar. De lo que he leído, yo debería ser capaz de hacer lo siguiente:

return new HttpResponseMessage<T>(objectInstance); 

Sin embargo, parece no ser capaz de hacer esto. ¿Es porque estoy usando una versión anterior de WebApi/.NET?


En una nota lateral, he encontrado que potencialmente podría crear una respuesta de la siguiente manera:

var response = new HttpResponseMessage(); 
response.Content = new ObjectContent(typeof(T), objectInstance, mediaTypeFormatter); 

Lo que me intrigó es la razón por qué tengo que añadir un mediaTypeFormatter aquí. He agregado el formateador de tipo de medios al nivel global.asax.

Gracias!

+0

Tienes que pasar el formateador porque de lo contrario ObjectContent tendría que usar un miembro estático para acceder a la colección global, lo que haría más difícil la prueba. –

+0

La solicitud no es estática, es un miembro de instancia de ApiController. –

Respuesta

60

HttpResponseMessage<T> se eliminó después de Beta. En este momento, en lugar de un escrito HttpResponseMessage hemos un escrito ObjectContent

Si crea manualmente HttpResponseMessage utilizando su constructor sin parámetros por defecto, no hay contexto de la petición disponibles para llevar a cabo la negociación de contenido - por eso es necesario especificar el formateador, o llevar a cabo negociación de contenido a mano.

Tengo entendido que no quiere hacer eso - a fin de utilizar esto en su lugar:

HttpResponseMessage response = Request.CreateResponse<MyObject>(HttpStatusCode.OK, objInstance); 

que crearía el mensaje de respuesta basándose en la negociación de contenido realizado en contra de la petición.

Por último, se puede leer más sobre la negociación de contenido aquí On this link

+4

Extraño el HttpResponseMessage , creo que fue una mejor API, pero Request.CreateResponse funciona bien. – Hugo

+3

Recuerde que cualquier método de controlador que use 'HttpResponseMessage' es muy difícil de probar en una unidad, por lo que es mejor evitar usarlo si puede. –

+7

@RoyDictus Tengo curiosidad por saber por qué dificulta las pruebas unitarias, ¿podría elaborarlas por favor? –

Cuestiones relacionadas