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
};
}
}