C# WebApi序列化错误

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; }

我有一个带有多个控制器的WebApi,这些控制器返回不同的结果。例如,一个控制器返回一个IEnumberable,另一个控制器返回一个Bar,另一个控制器返回一个IEnumberable of IEnumberable等,我所要做的就是:

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+其中SelectListIterator
2[[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
诺特
等
不错,但这引发了两个问题:

  • 为了测试webapi,我通过在Firefox地址栏中放置一个URL并在浏览器中查看结果来调用它。为什么第一个调用返回Json,第二个调用返回XML?据我所知,我只是使用默认的一切

  • 为什么XML现在要将名称空间添加到所有元素名称中?我能阻止吗?当我只是返回同样的东西没有包装,这没有发生


  • 将此代码添加到以下应用程序启动时的全局.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);