c# - net - Negociación de contenido para devolver HTML
json formatter web api asp net (1)
Si dejamos de lado la discusión de IHttpActionResult
por un momento, el proceso de negociación de contenido en la API web se realiza a través de formateadores. Por lo tanto, necesitaría crear un nuevo formateador para manejar el tipo de medio text/html
.
La API web expone el algoritmo predeterminado que utiliza para la negociación de contenido denominado DefaultContentNegotiator
que es una implementación del servicio IContentNegotiator
.
Ahora este algoritmo de negociación se puede ejecutar ya sea por API web de forma automática para que le guste en los siguientes casos:
Uso # 1 :
public MyObject Get(int id)
{
return new MyObject();
}
O
puede ejecutar manualmente la negociación usted mismo de la siguiente manera:
Uso # 2 :
public HttpResponseMessage Get()
{
HttpResponseMessage response = new HttpResponseMessage();
IContentNegotiator defaultNegotiator = this.Configuration.Services.GetContentNegotiator();
ContentNegotiationResult negotationResult = defaultNegotiator.Negotiate(typeof(string), this.Request, this.Configuration.Formatters);
response.Content = new ObjectContent<string>("Hello", negotationResult.Formatter, negotationResult.MediaType);
return response;
}
En cuanto a IHttpActionResults :
En el siguiente escenario, Ok<>
es un método abreviado para generar una instancia de tipo OkNegotiatedContentResult<>
.
public IHttpActionResult Get()
{
return Ok<string>("Hello");
}
La OkNegotiatedContentResult<>
es que este tipo de OkNegotiatedContentResult<>
hace algo similar al escenario de uso n.º 2 anterior. es decir, ejecutan el negociador internamente.
Por lo tanto, para concluir, si planea admitir el tipo de text/html
, debe escribir un formateador personalizado y agregarlo a la colección de formateadores de Web API y luego, cuando use Ok<string>("Hello")
con un encabezado Accept de text/html
, debería ver la respuesta en text/html
. Espero que esto ayude.
Después de leer esta publicación de blog sobre cómo devolver HTML desde Web API 2 utilizando IHttpActionResult
, quería de alguna manera "conectar" este IHttpActionResult
con mi ApiController
función del encabezado Accept
que se envía con la solicitud.
Dadas las acciones del controlador que tienen una firma similar a esta:
public MyObject Get(int id)
{
return new MyObject();
}
Si la solicitud especifica Accept: text/html
, este IHttpActionResult
debe usar para devolver HTML. ¿Es eso posible? Además, se apreciará mucho una idea de cómo funciona este conducto de negociación de contenido para json o xml (que tienen soporte incorporado).