C# WebApi序列化错误
我有一个带有多个控制器的WebApi,这些控制器返回不同的结果。例如,一个控制器返回一个IEnumberable,另一个控制器返回一个Bar,另一个控制器返回一个IEnumberable of IEnumberable等,我所要做的就是:C# WebApi序列化错误,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个带有多个控制器的WebApi,这些控制器返回不同的结果。例如,一个控制器返回一个IEnumberable,另一个控制器返回一个Bar,另一个控制器返回一个IEnumberable of IEnumberable等,我所要做的就是: return Ok(thething) 一切都很好,即使是复杂的嵌套对象也可以毫无问题地序列化 现在,客户机要求在包装器中返回所有结果: public class Wrapper { public bool Success { get; set; }
return Ok(thething)
一切都很好,即使是复杂的嵌套对象也可以毫无问题地序列化
现在,客户机要求在包装器中返回所有结果:
public class Wrapper
{
public bool Success { get; set; }
public int ErrorCode { get; set; }
public String ErrorMessage { get; set; }
public String Referer { get; set; }
public Object Payload { get; set; }
}
我认为这很简单,但当我试图从控制器返回它时:
return Ok( new Wrapper { Success=true, Referer="me", Payload=thething)
我得到一个序列化错误
例外消息是:
ObjectContent“1”类型未能序列化的响应正文
“内容类型”应用程序/xml;字符集=utf-8'
内部异常消息为:
类型
'System.Linq.Enumerable+其中SelectListIterator2[[epserver.Find.Api.SearchHit
1[[DGTNext.Api.Data.Entities.ProductSummary,
DGTNext.Api.Entities,版本=1.0.0.0,区域性=中性,
PublicKeyToken=null]],epserver.Find,版本=9.6.0.3185,
文化=中立,
PublicKeyToken=8fe83dea738b45b7],[DGTNext.Api.Data.Entities.ProductSummary,
DGTNext.Api.Entities,版本=1.0.0.0,区域性=中性,
PublicKeyToken=null]]”,具有数据协定名称
'ArrayOfProductSummary:'
这是预料不到的。如果您是,请考虑使用DATACONTROTCTIFER
使用DataContractSerializer或将任何静态未知的类型添加到
已知类型的列表-例如,通过使用KnownTypeAttribute
属性,或将它们添加到传递给
序列化程序
我做错了什么?为什么Ok()
函数以前似乎可以处理任何对象,但现在出现了问题
谢谢
编辑:根据要求,提供一个导致错误的简单示例:
class Foo {
public int AnInt { get; set; }
}
public IHttpActionResult Get() {
return Ok(new Wrapper { Success=true, Referer="me", Payload= new Foo {AnInt = 7}});
}
编辑:
嗯,我提出了一种解决方案,但它仍然会引起一些问题。
我使我的包装器成为有效负载类型的通用包装器
public class Wrapper<T>
{
public bool Success { get; set; }
public int ErrorCode { get; set; }
public String ErrorMessage { get; set; }
public String Referer { get; set; }
public T Payload { get; set; }
}
还有我的“真实”呼吁:
public IHttpActionResult Get(){
IEnumerable prods=db.getProductSummaries(shopId、区域性、查询参数、分页);
返回Ok(新包装{Success=true,Referer=“me”,Payload=prods});
}
返回:
0
2.
莱托亚洲
1073741838
诺特
等
不错,但这引发了两个问题:
将此代码添加到以下应用程序启动时的全局.asax: 从.Ignore更新到。序列化。它必须起作用
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
或者你可以看看这个你能用一个你正在传递有效载荷的对象的例子来修正你的问题吗?这个真的编译了吗:返回Ok(new Wrapper{Success=true,Referer=“me”,Payload=thething),最后你错过了}。应该是这样的:。返回Ok(新包装{Success=true,Referer=“me”,Payload=thething});是的,它会编译,复制粘贴错误。您想要JSON还是XML?据我所知,使用WebApi框架的优点之一是它将返回调用方要求的任何内容@托马斯利肯
{"Success":true,"ErrorCode":0,"ErrorMessage":null,"Referer":"me","Payload":[{"AnInt":7},{"AnInt":8}]}
public IHttpActionResult Get() {
IEnumerable<ProductSummary> prods = db.getProductSummaries(shopId, culture, queryParams, paging);
return Ok(new Wrapper<IEnumerable<ProductSummary>> { Success = true, Referer = "me", Payload = prods });
}
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);