何时使用HttpResponseMessage和Request.CreateResponse

时间:2014-02-27 06:05:37

标签: c# asp.net-web-api

我们应该何时使用HttpResponseMessage对象,何时应该使用Request.CreateResponse(...)方法?

此外,HttpResponseMessage对象和Request.CreateResponse(...)方法之间有什么区别?

2 个答案:

答案 0 :(得分:42)

  

HttpResponseMessage对象和。之间有什么区别   Request.CreateResponse(...)方法?

可能很明显但Request.CreateResponse是创建HttpResponseMessage对象的辅助方法。

  

当我们必须使用HttpResponseMessage对象时必须使用   Request.CreateResponse(...)方法?

如果您想使用内置内容协商功能,请使用Request.CreateResponse。返回对象时,ASP.NET Web API必须将对象序列化为响应主体。这通常可以是JSON或XML(其他媒体类型是可能的,但您需要创建格式化程序)。选择的媒体类型(JSON或XML)基于请求内容类型,请求中的Accept标头等,内容协商是确定要使用的媒体类型的过程。使用Request.CreateResponse,您将自动使用此过程的结果。

另一方面,如果您自己创建HttpResponseMessage,则必须指定基于其对序列化对象的媒体格式化程序,并通过自己指定媒体格式化程序,您可以覆盖连接的结果。< / p>

EDIT 以下是如何指定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。

答案 1 :(得分:4)

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
      };
    }
  }
相关问题