我们应该何时使用HttpResponseMessage
对象,何时应该使用Request.CreateResponse(...)
方法?
此外,HttpResponseMessage
对象和Request.CreateResponse(...)
方法之间有什么区别?
答案 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
};
}
}