paso example ejemplo create crear consumir c# asp.net-web-api

c# - example - Cuándo usar HttpResponseMessage y Request.CreateResponse



web api rest c# (2)

¿Cuál es la diferencia entre el objeto HttpResponseMessage y el método Request.CreateResponse (...)?

Probablemente sea obvio, pero Request.CreateResponse es un método auxiliar para crear el objeto HttpResponseMessage .

¿Cuándo debemos usar el objeto HttpResponseMessage y cuándo debemos usar el método Request.CreateResponse (...)?

Si desea usar la característica de negociación de contenido incorporada, use Request.CreateResponse . Cuando devuelve un objeto, ASP.NET Web API tiene que serializar el objeto en el cuerpo de respuesta. Esto podría ser generalmente JSON o XML (otros tipos de medios son posibles, pero debe crear el formateador). El tipo de medio elegido (JSON o XML) se basa en el tipo de contenido de solicitud, el encabezado Accept en la solicitud, etc., y la negociación de contenido es el proceso que determina el tipo de medio que se utilizará. Al usar Request.CreateResponse , automáticamente está utilizando el resultado de este proceso.

Por otro lado, si usted mismo crea HttpResponseMessage , debe especificar un formateador de medios basado en el cual el objeto será serializado y especificando el formateador de medios usted mismo, puede anular los resultados de conneg.

EDITAR Aquí hay un ejemplo de cómo especificar el formateador JSON.

public HttpResponseMessage Get(int id) { var foo = new Foo() { Id = id }; return new HttpResponseMessage() { Content = new ObjectContent<Foo>(foo, Configuration.Formatters.JsonFormatter) }; }

Con esto, incluso si envía una solicitud con Accept:application/xml , solo obtendrá JSON.

¿Cuándo deberíamos usar el objeto HttpResponseMessage y cuándo deberíamos usar el método Request.CreateResponse(...) ?

Además, ¿cuál es la diferencia entre el objeto HttpResponseMessage y el método Request.CreateResponse(...) ?


Request.CreateResponse (...) es solo un generador, también devuelve una instancia de HttpResponseMessage, aquí está el código:

public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request, HttpStatusCode statusCode, T value, HttpConfiguration configuration) { if (request == null) throw Error.ArgumentNull("request"); configuration = configuration ?? HttpRequestMessageExtensions.GetConfiguration(request); if (configuration == null) throw Error.InvalidOperation(SRResources.HttpRequestMessageExtensions_NoConfiguration, new object[0]); IContentNegotiator contentNegotiator = ServicesExtensions.GetContentNegotiator(configuration.Services); if (contentNegotiator == null) { throw Error.InvalidOperation(SRResources.HttpRequestMessageExtensions_NoContentNegotiator, new object[1] { (object) typeof (IContentNegotiator).FullName }); } else { IEnumerable<MediaTypeFormatter> formatters = (IEnumerable<MediaTypeFormatter>) configuration.Formatters; ContentNegotiationResult negotiationResult = contentNegotiator.Negotiate(typeof (T), request, formatters); if (negotiationResult == null) { return new HttpResponseMessage() { StatusCode = HttpStatusCode.NotAcceptable, RequestMessage = request }; } else { MediaTypeHeaderValue mediaType = negotiationResult.MediaType; return new HttpResponseMessage() { Content = (HttpContent) new ObjectContent<T>(value, negotiationResult.Formatter, mediaType), StatusCode = statusCode, RequestMessage = request }; } }