返回一个对象并控制状态代码

Hen*_*sen 3 asp.net-web-api

我从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;
Run Code Online (Sandbox Code Playgroud)

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

public class ObjectContent<T> : ObjectContent
{
    public ObjectContent(T value, MediaTypeFormatter formatter)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,似乎我必须将MediaTypeFormatter传递给它,将内容协商混合到动作的逻辑中.在我们的设置中,内容协商是通用的,并且与控制器完全分离.

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

mar*_*ind 5

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

Session session = GetSessionInfo(requestMessage);
var response = Request.CreateResponse(HttpStatusCode.Created, session);
return response;
Run Code Online (Sandbox Code Playgroud)