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. JSON で返されるように Web API を変更すると、クライアントの ajax コードが機能します。
  2. XML から読み取るようにクライアントの ajax コードを変更する

クライアント側で JSON を読み取る方が簡単なので、#1 をお勧めします。ここでの考え方は、サーバー側でデータを CLR 型に逆シリアル化して、コンテンツ ネゴシエーションを利用して応答を JSON にシリアル化できるようにすることです。#1を実装するための手順は次のとおりです。

  • クラスを作成しますPersons。これを行う簡単な方法の 1 つは、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;
        }
    
  • 追加のビジネス ロジックを実行します (つまり、名前でフィルター処理します)。
  • GetPersonstype を返す必要がありますPersons
于 2013-04-22T23:28:48.913 に答える