2012-04-06 14 views
12

Acabo de comenzar a usar ServiceStack, que es una increíble biblioteca.ServiceApunte y devuelva una secuencia

Sin embargo, tengo un requisito de negocio donde debemos devolver xml y json donde el xml debe estar en formato específico.

<service name="service1" type="audio" .../> 

así que básicamente un montón de atributos:

Por ejemplo, tenemos clientes que esperan XML del formato existente.

Sé que ServiceStack usa conceptos de DTO y usa el DataContractSerializer que devuelve los elementos xml en lugar del formulario anterior con atributos xml.

Todavía quiero utilizar los dtos de peticiones (que pasan en application/xml o application/json en la cabecera Aceptar) y luego puedo crear mis propias cadenas XML o cadenas JSON y luego devolverlos como:

string result = "....xml or json string..."; 
return new MemoryStream(Encoding.UTF8.GetBytes(result)); 

donde la cadena resultante podría ser una cadena xml o una cadena json.

Noté en el violín la respuesta Content-Type como text/html.

Con el enfoque que estoy usando, ¿estoy violando algún principio de REST? ¿Habrá problemas con el tipo de contenido tal como está actualmente (texto/html)?

Si utilizo este enfoque, resuelve los requisitos del negocio.

Editar

I descubierto que puedo devolver un httpResult como:

return new HttpResult(
     new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml"); 

que da el tipo de contenido correcto.

Entonces, ¿es este el camino correcto o tendré problemas si sigo esta ruta?

Respuesta

17

Sí al devolver un IHttpResult le permitirá controlar la carga útil exacta, Content-Type y otros encabezados HTTP que desee.

Además, no se limita a devolver una secuencia, es decir, puede usar HttpResult para devolver una cadena xml con un tipo de contenido diferente.

Éstos son algunos enlaces que mejor demuestran lo que es posible con los tipos de retorno ServiceStack:

También puede devolver un archivo estático usando un FileInfo objeto, con un parámetro opcional para regresar el archivo como un archivo adjunto que se pedirá al usuario que descargue el archivo en lugar de tratar de verlo en el navegador con:

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true); 
+0

Gracias por la ayuda. –

+0

¿Sería beneficioso devolver una cadena en lugar de una secuencia? –

+2

No, ambos se escriben directamente en HttpResponse OutputStream de ASP.NET. Por lo tanto, usar un MemoryStream (si ya tiene el String en la memoria) agrega una sobrecarga adicional. Tiene sentido devolver una cadena cuando desee transmitir la salida (es decir, evitar cargar toda la respuesta en la memoria) – mythz

Cuestiones relacionadas