在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的生命周期,能不能给出一些指导呢?
谢谢。
答案 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 };
}