【问题标题】:asp.net web api having trouble sending objectsasp.net web api在发送对象时遇到问题
【发布时间】:2013-01-01 19:55:24
【问题描述】:

我刚刚切换到使用适用于 MVC 4 的新 Web api,我在反序列化来自我的 Web 服务的响应时遇到了很大的困难。

这是我的服务器代码:

IEnumerable<Fish> myList = GetFish();

return Request.CreateResponse(HttpStatusCode.OK, myList,"application/xml");

这被序列化为:

&lt;ArrayOfFish xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MySolution.NameSpace.Resources\" /&gt;

因为没有返回结果。

当我尝试使用 XmlMediaTypeFormatter 解析它时,我收到一条错误消息,指出它没有预料到它会得到什么。

我的反序列化代码与我开始使用 web api 之前没有变化,只是:

return content.ReadAsAsync&lt;T&gt;(formatters).Result;

formatters 是一个List 的格式化程序,只包含XmlMediaTypeFormatter

T 是Fish 的通用列表

如果我省略 "application/xml" 类型,那么它似乎以 JSon 发送(因为结果是 [])但是客户端需要 xml,并且由于某种原因不会在其上使用 JSon 序列化程序,即使我明确输入类型为text/json。

反序列化对象应该相当简单,因为这正是我之前所做的,我只是稍微更改了我的服务器以使用CreateResponse 来创建HttpResponseMessage,而不是直接使用HttpResponseMessage&lt;T&gt;,因为不再支持通用版本。我在网上找不到单个客户端/服务器示例,有人将结果解码为令人沮丧的对象。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    XmlSerializer 无法序列化接口 (IEnumerable)。在返回之前转换为 List。

    return Request.CreateResponse(HttpStatusCode.OK, myList.ToList(),"application/xml");
    

    这里有参考的类似问题 - XmlSerializer won't serialize IEnumerable

    【讨论】:

      【解决方案2】:

      我最终发现 web api 使用的序列化方法与以前的标准方法略有不同。我将此添加到我的 global.asax 并解决了问题:

      GlobalConfiguration.Configuration.Formatters.Insert(0, new XmlMediaTypeFormatter() { UseXmlSerializer = true });

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 2020-03-15
        • 2018-09-13
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 2023-02-04
        相关资源
        最近更新 更多