0

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

我究竟做错了什么?

4

1 回答 1

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 的类型......

以下是您的方案的 2 个实现:

  1. 修改您的 Web API 以返回 JSON,您的客户端 ajax 代码将起作用
  2. 修改您的客户端 ajax 代码以从 XML 中读取

我更喜欢#1,因为它更容易在客户端读取 JSON。这里的想法是在服务器端将您的数据反序列化为 CLR 类型,以便我们可以利用内容协商将响应序列化为 JSON。以下是我将采取的实施#1的步骤:

  • 创建一个Persons类。一种简单的方法是将 XML 文件的内容复制到剪贴板并使用 Visual Studio 中的“将 XML 粘贴为类”功能(在“编辑”>“选择性粘贴”下)
  • 用于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
于 2013-04-22T23:28:48.913 回答