我有这个WebAPI,我正在尝试将xml数据返回给客户端。
[HttpGet]
public IEnumerable<XElement> GetPersons(string name)
{
var doc = XDocument.Load(path);
var result = doc.Element("Persons")
.Elements("Person")
.Where(x => (string)x.Element("name") == name);
return result();
}
直接调用数据(http://localhost:63068/api/GetPersons/b
):
<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfXElement xmlns="http://schemas.datacontract.org/2004/07/System.Xml.Linq" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<XElement>
<Person xmlns="">
<PersonID>1</PersonID>
<Name>b</UserName>
</Person>
</XElement>
<XElement>
<Person xmlns="">
<PersonID>2</PersonID>
<Name>b</UserName>
</Person>
</XElement>
</ArrayOfXElement>
从客户端调用服务时出错:
$.ajax({
url: baseURL + 'GetPersons/' + $('#txtUserName2').val(),
type: "GET",
success: function (result) {
divResults.html(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
divResults.html(err);
}
});
{"Message":"An error has occurred.","ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"An error has occurred.","ExceptionMessage":"An item with the same key has already been added.","ExceptionType":"System.ArgumentException","StackTrace":" at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)\r\n
我做错了什么?
答案 0 :(得分:0)
您的方案似乎是让您的Web API返回服务器上文件path
中的数据,并且您的客户端会使用此数据。
您面临的问题是IEnumerable<XElement>
无法序列化为JSON:
The 'ObjectContent`1' type failed to serialize
the response body for content type 'application/json; charset=utf-8'.
原因是XElement
是一种非常特定于XML的类型......
以下是您的方案的两个实现:
我更喜欢#1,因为在客户端更容易阅读JSON。这里的想法是将您的数据反序列化为服务器端的CLR类型,以便我们可以利用内容协商将响应序列化为JSON。以下是我将采取的步骤#1:
Persons
课程。一种简单的方法是将XML文件的内容复制到剪贴板上,并使用Visual Studio中的“粘贴XML作为类”功能(在编辑&gt;选择性粘贴下)使用XmlSerializer
将path
中定义的数据反序列化为上述步骤中创建的Persons
类型:
using (var streamReader = new FileStream(path, FileMode.Open))
{
var xmlS = new XmlSerializer(typeof(Persons));
results = xmlS.Deserialize(streamReader) as Persons;
}
GetPersons
返回Persons
类型。