Quand utiliser HttpResponseMessage et Request.Créateresponse
quand utiliser le HttpResponseMessage
objet et quand doit-on utiliser le Request.CreateResponse(...)
méthode?
Aussi, quelle est la différence entre HttpResponseMessage
et Request.CreateResponse(...)
méthode?
2 réponses
Quelle est la différence entre L'objet HttpResponseMessage et Demande.CreateResponse(...) méthode?
Il est sans doute évident, mais Request.CreateResponse
est une méthode d'aide pour créer HttpResponseMessage
objet.
quand nous devons utiliser L'objet HttpResponseMessage et quand nous devons utiliser Demande.CreateResponse(...) méthode?
si vous voulez utiliser la fonction de négociation de contenu intégrée, utilisez Request.CreateResponse
. Quand vous retournez un objet, ASP.NET L'API Web doit sérialiser l'objet en corps de réponse. Cela peut être généralement JSON ou XML (d'autres types de médias sont possibles mais vous devez créer le formatteur). Le type de média choisi (JSON ou XML) est basé sur le type de contenu de la requête,Accept
en-tête de la demande et ainsi de suite et la négociation de contenu est le processus qui détermine le type de média à utiliser. À l'aide de Request.CreateResponse
, vous utilisez automatiquement le résultat de ce processus.
en revanche, si vous créez HttpResponseMessage
vous-même, vous devez spécifier un media formatter basé sur lequel l'objet sera sérialisé et en spécifiant le media formatter vous-même, vous pouvez outrepasser les résultats de conneg.
modifier Voici un exemple de la façon de spécifier JSON formatter.
public HttpResponseMessage Get(int id)
{
var foo = new Foo() { Id = id };
return new HttpResponseMessage()
{
Content = new ObjectContent<Foo>(foo,
Configuration.Formatters.JsonFormatter)
};
}
avec ceci, même si vous envoyez une requête avec Accept:application/xml
, vous n'aurez que JSON.
requête.CreateResponse(...) est juste un constructeur, il renvoie également instance de HttpResponseMessage, voici le code:
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
};
}
}