2012-06-04 20 views
3

我从nuget.org上的ASP.NET Web API版本(星期五RC之前的版本)升级到myget.org上的夜间版本。正如预期的那样,有很多重大更改,其中一个我似乎无法解决:我们有一个方案,我们希望我们的操作返回一个对象并将状态代码设置为201 Created。这是很容易做之前(可能无法编译 - 从我的头顶概念性代码):返回对象和控制状态代码

Session session = GetSessionInfo(requestMessage); 
var response = new HttpResonseMessage(HttpStatusCode.Created); 
response.Content = response.CreateContent(session); 
return response; 

createContent中实际上是位于System.Net.Http.HttpResponseMessageExtensions调用ObjectContent内部构造的扩展方法。随着新版本的发布,HttpResponseMessageExtensions似乎在新版本中消失了,ObjectContent的内部构造函数也一样。现在看来我必须调用ObjectContent构造,下面似乎是最适合我们的需要:

public class ObjectContent<T> : ObjectContent 
{ 
    public ObjectContent(T value, MediaTypeFormatter formatter) 
    { 
    } 
} 

不过看来我的MediaTypeFormatter传进去,内容协商混合成的逻辑行动。在我们的设置中,内容协商是通用的,并且与控制器完全分离。

有没有人有解决方案的建议来返回对象,设置响应状态码,但不必处理MediaTypeFormatter,媒体类型或任何其他内容协商相关的东西?

回答

5

我们重新设计了如何创建ObjectContent<T>。从RC开始,您应该调用CreateResponse()一套扩展方法(它们关闭HttpRequestMessage)。这实际上会产生一个HttpResponseMessage的实例,里面有一个内容协商的ObjectContent<T>的实例。所以,像这样:

Session session = GetSessionInfo(requestMessage); 
var response = Request.CreateResponse(HttpStatusCode.Created, session); 
return response; 
+0

感谢@marcind,这是有道理的。 –