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、媒体类型或任何其他与内容协商相关的东西?

4

1 回答 1

5

我们重新设计了ObjectContent<T>创作的运作方式。从 RC 开始,您应该调用一CreateResponse()组扩展方法(它们是 off HttpRequestMessage)。这实际上会产生一个HttpResponseMessage带有内容协商实例的实例ObjectContent<T>。所以,像:

Session session = GetSessionInfo(requestMessage);
var response = Request.CreateResponse(HttpStatusCode.Created, session);
return response;
于 2012-06-05T01:35:48.413 回答