我的 Web API 序列化出现错误

2024-04-19

我有一个带有多个返回不同结果的控制器的 WebApi。例如,一个控制器返回了IEnumerable<Foo>,另一个Bar,另一个IEnumerable of IEnumerable等等,而我所要做的就是:

return Ok(thething)

一切工作正常,即使是复杂的嵌套对象也可以毫无问题地序列化。

现在,客户要求所有结果都在包装器中返回:

public class Wrapper
{
    public bool Success { get; set; }
    public int ErrorCode { get; set; }
    public String ErrorMessage { get; set; }
    public String Referrer { get; set; }
    public Object Payload { get; set; }
}

认为这很简单,但是当我尝试从控制器返回它时:

return Ok(new Wrapper { Success = true, Referrer = "me", Payload = thething)

我收到序列化错误:

“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文;字符集=utf-8'。

内部异常消息是:

'System.Linq.Enumerable+WhereSelectListIterator2[[EPiServer.Find.Api.SearchHit1[[DGTNext.Api.Data.Entities.ProductSummary, DGTNext.Api.Entities,版本=1.0.0.0,文化=中性, PublicKeyToken=null]],EPiServer.Find,版本=9.6.0.3185, 文化=中立, PublicKeyToken=8fe83dea738b45b7],[DGTNext.Api.Data.Entities.ProductSummary, DGTNext.Api.Entities,版本=1.0.0.0,文化=中性, PublicKeyToken=null]]' 带有数据合约名称 'ArrayOfProductSummary:http://schemas.datacontract.org/2004/07/DGTNext.Api.Data.Entities' http://schemas.datacontract.org/2004/07/DGTNext.Api.Data.Entities%27预计不会。如果您是,请考虑使用 DataContractResolver 使用 DataContractSerializer 或添加任何静态未知的类型 已知类型的列表 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给的已知类型列表中 序列化器。

我究竟做错了什么?为什么Ok()函数以前似乎可以处理任何对象,但现在有问题吗?

Thanks.

编辑:根据要求,导致错误的简单示例:

class Foo 
{
    public int AnInt { get; set; }
}

public IHttpActionResult Get() 
{
    return Ok(new Wrapper { Success = true, Referrer = "me", Payload = new Foo { AnInt = 7 } });
}

Edit #2:嗯,我想出了一种解决方案,但它仍然提出了一些问题。

我使我的包装器在有效负载类型中通用。

public class Wrapper<T>
{
    public bool Success { get; set; }
    public int ErrorCode { get; set; }
    public String ErrorMessage { get; set; }
    public String Referrer { get; set; }
    public T Payload { get; set; }
}

所以现在,这有效:

public IHttpActionResult Get() 
{
    List<Foo> foos = new List<Foo>();
    foos.Add(new Foo { AnInt = 7 });
    foos.Add(new Foo { AnInt = 8 });

    return Ok(new Wrapper<IEnumerable<Foo>> { Success = true, Referrer = "me", Payload = foos });
}

它返回:

{
    "Success": true,
    "ErrorCode": 0,
    "ErrorMessage": null,
    "Referrer": "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, Referrer = "me", Payload = prods });
}

returns:

<WrapperOfArrayOfProductSummaryzc2y5_Pnl>
    <ErrorCode>0</ErrorCode>
    <ErrorMessage i:nil="true"/>
    <Payload>
        <d2p1:ProductSummary>
            <d2p1:Culture i:nil="true"/>
            <d2p1:Guid i:nil="true"/>
            <d2p1:Id>2</d2p1:Id>
            <d2p1:Name>Letto Asia</d2p1:Name>
            <d2p1:ambient>
                <d2p1:Id>1073741838</d2p1:Id>
                <d2p1:Name>notte</d2p1:Name>
            </d2p1:ambient>  
    etc.

所以还不错,但这提出了两个问题:

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

  2. 为什么 XML 现在要将该命名空间添加到所有元素名称中?我可以阻止这种情况吗?当我只是在没有包装的情况下返回相同的东西时,这种情况并没有发生。


将此代码添加到全局.asax下面关于应用程序_启动:

更新自.Ignore to 。连载。它必须有效。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
        GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

或者你可以看看这个answer https://stackoverflow.com/questions/23098191/failed-to-serialize-the-response-in-web-api-with-json

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 Web API 序列化出现错误 的相关文章

随机推荐

  • 为什么相邻同级选择器不起作用? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 根据相邻同级选择器的定义 以下代码应该可以工作 然而事实并非如此 我似乎没有发现任何错误 p p p This is the sibling
  • Mysql 查询日期 >= 90 天

    我想在数据库中查询日期等于或大于 90 天的记录 这是我到目前为止所拥有的 format Y m j G i s date date format 90 days from today date format strtotime 90 da
  • 使用反射设置枚举

    如何使用反射设置枚举 我的班级有枚举 public enum LevelEnum NONE CRF SRS HLD CDD CRS 在运行时我想将该枚举设置为 CDD 例如 我该怎么做 尝试使用类枚举 LevelEnum s LevelEn
  • Python 中的基本转换器

    我正在编写一个程序 用于在 Python 中将任何基数转换为基数 10 该程序的代码如下所示 print Enter the number you want to convert to base 10 number input length
  • 如何将 CLOB 数据从一个数据库传输到另一个具有 DBLinks 的远程 ORACLE 数据库

    问题是 如何将 CLOB 数据从一个源数据库传输到另一个具有 DBLink 的 Oracle 数据库 Oracle无法使用DBLinks传输CLOB数据 那么除了 将Oracle中的字段扩展为Varchar2 32 767个字符 Oracl
  • Javascript - 在 ES5 中扩展 ES6 类

    我正在使用以下代码作为滑块Siema https pawelgrzybek github io siema https codepen io pawelgrzybek pen boQQWy https codepen io pawelgrz
  • 命令提示符中的代码在批处理文件中不起作用

    当我在命令提示符中执行下面的代码时 它会执行我想要的操作 但当我将其放入 bat 文件并尝试执行它时 它不会执行我想要的操作 for f a in dir b csv do for f tokens b in a do echo b a g
  • jQuery - 如何将多个节点附加到容器

    我需要将多个节点附加到容器中 我不想在每次迭代中执行缓慢的 DOM 追加 而是想将文档片段中的节点排队 对其他想法开放 并一次将它们全部追加 这是我的代码 var fragment document createDocumentFragme
  • macOS Sierra 安装 PHP 扩展 intl

    我正在尝试让 magento 2 x 在我的机器上运行 我在用xampp 5 6使用相同的 php 版本并运行虚拟 apache 服务器 As seen in this screenshot The PHP Extension intl i
  • 在全局范围内声明命名空间错误

    我有 3 个文件 Test h Test cpp 和 main cpp Test h ifndef Test H define Test H namespace v int g 9 class namespce public namespc
  • 响应式表格,智能方式

    我有一个包含数据的表 表格数据 它看起来像这样 See 这把小提琴 http jsfiddle net MrLister c54RN 现在我想要的是 当它显示在较窄的屏幕上时 表格看起来像这样 这样你就不会得到水平滚动条并且它保持相同的视觉
  • 尝试使用锐利的 Node.js 调整流图像的大小

    我正在尝试使用锐利功能调整从用户到服务器的输入流图像的宽度和高度 但图像没有任何反应 它保持原来的大小 我应该如何使用锐化功能 以便我可以使图像变小或变大 请帮我 这就是我的代码的样子 use strict const builder re
  • 比较堆栈中的两个值? [复制]

    这个问题在这里已经有答案了 我卡住了 在我的汇编代码中 我想比较两个值 堆 x86 语法 AT T cmpl 4 ebp 4 ebp 错误 cmp 的内存引用太多 我认为不可能根据乘数和 ebp 来比较两个值 有什么建议 您可以使用 CMP
  • 如何将空白复选框作为 false 传递给参数

    我有一个更新用户表单的表单 其中几个元素是复选框 我希望 true 传递给参数 如果选中 这是工作 false 传递给参数 如果未选中 不工作 未经检查的项目甚至没有发送到参数 如何使未检查的项目作为错误通过 Form h4 Please
  • Junit 异常测试用例 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 public class TipException extends Exception private final Object mSour
  • Python ARIMA模型,预测值发生偏移

    我是 Python ARIMA 实现的新手 我有几个月 15 分钟一次的数据 我尝试遵循 Box Jenkins 方法来拟合时间序列模型 我在最后遇到了一个问题 这ACF PACF图 https i stack imgur com weNJ
  • Haskell 中自动函数约束推导的类型约束

    出于教育目的 我在 Haskell 中摆弄树木 我有Tree a像这样定义的类型 data Tree a EmptyTree Node a Tree a Tree a 以及许多共享基本约束的函数 Ord a 所以他们有这样的类型 treeI
  • 无法点击 iframe 内的按钮

    设想 Launch http www indiabookstore net http www indiabookstore net 点击FB 类似按钮它位于 iframe 内 向下滚动即可看到 Issue 我可以切换到 iframe 但无法
  • Android 上的图像处理 - 我可以使用哪些库?

    我专门需要它来处理图像失真 滤镜 模糊等 也欢迎 你知道一些我可以使用的具有适当许可证的库 还有 Apache MIT LGPL 吗 价格合理的专有图书馆 也向他们开放 也可以用C语言 提前致谢 达内尔 您可能想查看OpenCV http
  • 我的 Web API 序列化出现错误

    我有一个带有多个返回不同结果的控制器的 WebApi 例如 一个控制器返回了IEnumerable