从WebAPI返回IEnumerable <xelement>,客户端</xelement>上的错误

时间:2013-04-22 15:58:28

标签: jquery xml asp.net-web-api

我有这个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 

我做错了什么?

1 个答案:

答案 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. 修改您的Web API以使用JSON返回,并且您的客户端ajax代码将起作用
  2. 修改您的客户端ajax代码以从XML中读取
  3. 我更喜欢#1,因为在客户端更容易阅读JSON。这里的想法是将您的数据反序列化为服务器端的CLR类型,以便我们可以利用内容协商将响应序列化为JSON。以下是我将采取的步骤#1:

    • 创建一个Persons课程。一种简单的方法是将XML文件的内容复制到剪贴板上,并使用Visual Studio中的“粘贴XML作为类”功能(在编辑&gt;选择性粘贴下)
    • 使用XmlSerializerpath中定义的数据反序列化为上述步骤中创建的Persons类型:

          using (var streamReader = new FileStream(path, FileMode.Open))
          {
              var xmlS = new XmlSerializer(typeof(Persons));
              results = xmlS.Deserialize(streamReader) as Persons;
          }
      
    • 您拥有任何其他业务逻辑(即按名称过滤)
    • 让您的GetPersons返回Persons类型。