在Web API中执行操作后更改返回的对象值

时间:2014-05-09 11:17:56

标签: asp.net-mvc asp.net-web-api json.net

在ASP.Net Web API中,操作返回的对象将自动转换为XML或JSON - 有没有办法在返回的对象转换之前添加其他进程?

我想要实现的是将返回的对象包装到通用的 APIResponse (另一个类)类型中,该类型具有一个名为 Data 的对象属性,该对象将被分配给任何原始返回的对象是。

例如:

public Books[] FindBooks(string keyword)
{
..
    return new Books[] {new Book(){Name="ASP.NET"}};
}

默认情况下,这将返回book数组的JSON,但是我想将结果包装到一个名为APIResponse的对象中,因此返回的对象变为:

new APIResponse(){
    Data = //the Book[] array return from the action method
}

通过这样做,我将能够保持在Web API中返回正常业务对象的自由,但是当前端Ajax请求时,总是以JSON格式返回相同的对象类型。

我相信它可以通过某种方式完成,但我不熟悉Web API的生命周期,能不能给出一些指导呢?

谢谢。

3 个答案:

答案 0 :(得分:3)

我通过创建自定义MediaTypeFormatter来修复它,但是只是继承了JSON格式化程序,它已经得到了我需要的所有东西,这里是我添加的非常简单的代码,它解决了我所有的问题!!!

    public class APIResponseMediaFomatter : JsonMediaTypeFormatter
    {
        public override Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext)
        {
            ResponseMessage wrappedValue = null;
            if (type != typeof(ResponseMessage) || (value != null && value.GetType() != typeof(ResponseMessage)))
                wrappedValue = new ResponseMessage(value);
            return base.WriteToStreamAsync(typeof(ResponseMessage), wrappedValue, writeStream, content, transportContext);
        }
    }

干杯!

答案 1 :(得分:0)

有趣的是,Web API已经完全符合您的描述。它已经具有可以保存对象有效负载的通用请求和响应类。只需执行以下操作,

public HttpResponseMessage FindBooks(string keyword)
{
    ...
    var books = new Books[] {new Book(){Name="ASP.NET"}};
    var content = new ObjectContent<Book[]>(books,new JsonMediaTypeFormatter());
    return new HttpResponseMessage { Content = content);
}

没有必要重新发明自己的通用响应对象,它可以保存元数据和数据,HTTP已经为您完成了。

答案 2 :(得分:0)

为什么不从WebAPI

返回包装器对象APIResponse
public APIResponse FindBooks(string keyword)
{
    var books = new Books[] {new Book(){Name="ASP.NET"}};
    return new APIResponse {Data= books };
}