2011-11-14 7 views
9

Tengo un servicio WCF autohospedado que se ejecuta como un servicio de Windows usando WebAPI para manejar las cosas REST y funciona muy bien.Cómo devuelvo html sin procesar desde WCF WebAPI WebGet

Me doy cuenta de que realmente debería usar IIS o similar para distribuir páginas web reales, pero ¿hay ALGUNA forma de obtener una llamada de servicio para devolver "solo" html?

aunque especifique "BodyStye desnudo", sigo teniendo la envoltura XML en todo el HTML real, es decir

<?xml version="1.0" encoding="UTF-8"?> 
<string> html page contents .... </string> 


[WebGet(UriTemplate = "/start", BodyStyle = WebMessageBodyStyle.Bare)] 
public string StartPage() 
{ 
    return System.IO.File.ReadAllText(@"c:\whatever\somefile.htm"); 
} 

¿Hay alguna manera de hacer esto o debería renunciar?

Respuesta

16

El atributo bodystyle no tiene ningún efecto en WCF Web API. El siguiente ejemplo funcionará. No es necesariamente la mejor manera de hacerlo, pero debería funcionar suponiendo que no cometí errores tipográficos :-).

[WebGet(UriTemplate = "/start")] 
public HttpResponseMessage StartPage() { 
    var response = new HttpResponseMessage(); 
    response.Content = new StringContent(System.IO.File.ReadAllText(@"c:\whatever\somefile.htm")); 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); 
    return response; 
} 

probablemente tendría más sentido para leer el archivo como una corriente y utilizar StreamContent en lugar de StringContent. O es bastante fácil crear su propia clase FileContent que acepte el nombre del archivo como parámetro.

Y, la opción de auto-host es una forma tan viable de devolver HTML estático como usando IIS. Debajo de las cubiertas usan el mismo controlador de modo kernel HTTP.sys para entregar los bits.

+3

Gracias montones, eso fue lo suficientemente cerca como para llevarme allí, solo tuve que cambiar la línea a "response.Content.Headers.ContentType = new MediaTypeHeaderValue (" text/html "); " – Swordblaster

4

Deberá usar un formateador que acepte "text/html" como tipo de contenido y solicite el tipo de contenido "text/html" en el encabezado de su solicitud.

Si no agrega un formateador que maneja el texto/html, la API web vuelve al formato XML como predeterminado.

En su caso, el formateador no necesita formatear nada, solo devuelve el valor devuelto, ya que ya está devolviendo el formato de html.

Cuestiones relacionadas