2013-04-22 30 views
0

我有這個WebAPI,我試圖返回xml數據到客戶端。從客戶端調用該服務時從WebAPI返回IEnumerable <XElement>,客戶端的錯誤

<?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 

我在做什麼錯

[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)?

+0

您是否嘗試過在進行ajax請求之後進行調試 - 如預期的那樣是「result」的格式?你是否發送了正確的頭文件(對於xml而不是json)?你到底在哪一點得到錯誤?即哪些陳述導致了它?你是否在這段代碼附近的任何地方使用字典(或者可能是通過密鑰進行緩存,其中密鑰是名稱等)?原始的xml文檔是否形成良好? – 2013-04-22 20:37:11

回答

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
+0

具有完美的感覺。謝謝! – tempid 2013-05-09 11:21:18

相關問題