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?

32
demandé sur SteveC 2014-02-27 10:05:37

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.

38
répondu Badri 2014-02-27 14:27:44

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
      };
    }
  }
4
répondu Anton Levshunov 2016-05-18 18:52:27