Когда использовать HttpResponseMessage и Request.CreateResponse

Когда мы должны использовать объект HttpResponseMessage и когда мы должны использовать метод Request.CreateResponse(...)?

Кроме того, в чем разница между объектом HttpResponseMessage и Request.CreateResponse(...)?

Ответ 1

В чем разница между объектом HttpResponseMessage и Метод Request.CreateResponse(...)?

Вероятно, это очевидно, но Request.CreateResponse является вспомогательным методом для создания объекта HttpResponseMessage.

Когда мы должны использовать объект HttpResponseMessage и когда мы должны использовать Метод Request.CreateResponse(...)?

Если вы хотите использовать встроенную функцию согласования контента, используйте Request.CreateResponse. Когда вы возвращаете объект, веб-API ASP.NET должен сериализовать объект в тело ответа. Это может быть вообще JSON или XML (возможны другие типы носителей, но вам нужно создать форматтер). Выбранный тип мультимедиа (JSON или XML) основан на типе содержимого запроса, заголовке Accept в запросе и так далее, а согласование содержимого - это процесс, который определяет используемый тип носителя. Используя Request.CreateResponse, вы автоматически используете результат этого процесса.

С другой стороны, если вы создаете HttpResponseMessage самостоятельно, вы должны указать медиаформат, основанный на том, какой объект будет сериализован, и самостоятельно указав медиаформат, вы можете переопределить результаты conneg.

ИЗМЕНИТЬ Вот пример того, как указать форматировщик JSON.

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

При этом, даже если вы отправляете запрос с Accept:application/xml, вы получите только JSON.

Ответ 2

Request.CreateResponse(...) - это просто построитель, он также возвращает экземпляр HttpResponseMessage, вот код:

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