0

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

这是我的服务器代码:

IEnumerable<Fish> myList = GetFish();

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

这被序列化为:

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

因为没有返回结果。

当我尝试使用 解析这个时XmlMediaTypeFormatter,我收到一个错误,说它没有预料到它会得到什么。

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

return content.ReadAsAsync<T>(formatters).Result;

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

T 是一个通用列表Fish

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

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

有任何想法吗?

4

2 回答 2

0

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

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

于 2013-01-02T11:30:54.580 回答
0

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

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

这里有参考的类似问题 - XmlSerializer 不会序列化 IEnumerable

于 2013-01-01T23:11:09.447 回答