我刚刚转而使用新的web api for MVC 4,而且我很难将我的webservice的响应反序列化。
这是我的服务器代码:
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;
格式化程序是List
格式化程序,仅包含XmlMediaTypeFormatter
T是Fish
如果我省略了"application/xml"
类型,那么它似乎在JSon中发送(因为结果是[])但是客户端需要xml,并且由于某种原因不会在它上面使用JSon序列化器,即使我明确将类型设为text/json
。
将对象反序列化应该相当简单,因为它正是我之前所做的,我只是稍微改变了我的服务器以使用CreateResponse
来制作HttpResponseMessage
而不是使用{{1直接,因为不再支持通用版本。我无法在网上找到一个客户/服务器示例,其中有人将结果解码为令人沮丧的对象。
有什么想法吗?
答案 0 :(得分:0)
XmlSerializer无法序列化接口(IEnumerable)。在返回之前转换为List。
return Request.CreateResponse(HttpStatusCode.OK, myList.ToList(),"application/xml");
带有引用的simlar问题 - XmlSerializer won't serialize IEnumerable
答案 1 :(得分:0)
我最终发现web api使用的序列化方法与前一种标准方式略有不同。我将此添加到我的global.asax
并解决了问题:
GlobalConfiguration.Configuration.Formatters.Insert(0, new XmlMediaTypeFormatter() { UseXmlSerializer = true });