2

VS2012 の「XML をクラスとして貼り付け」機能を使用して、Web API を使用した Rest 呼び出しからの XML 結果を適切に逆シリアル化するのに問題があります。

呼び出しからの XML 応答は次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SCResponse>
    <AccountId>86</AccountId>
    <Administrator>false</Administrator>
    <Email>6z@z.com</Email>
    <FirstName>6z@z.com</FirstName>
    <Label>false</Label>
    <LastName>6z@z.com</LastName>
    <link href="https://cnn.com" rel="news" title="News"/>
</SCResponse>

この XML をコピーし、便利な新機能を使用して、この XML をクラスとして貼り付けました。

namespace Models.account.response
{
    [XmlRoot(ElementName = "SCResponse")] // I added this so I could name the object Account
    [DataContract(Name = "SCResponse", Namespace = "")] // I added this as the namespace was causing me problems
    public partial class Account
    {
        public byte AccountId { get; set; }

        public bool Administrator { get; set; }

        public string Email { get; set; }

        public string FirstName { get; set; }

        public bool Label { get; set; }

        public string LastName { get; set; }

        [XmlElement("link")]
        public SCResponseLink[] Link { get; set; }
    }

    [XmlType(AnonymousType = true)]
    public partial class SCResponseLink
    {
        private string hrefField;

        private string relField;

        private string titleField;

        [XmlAttribute)]
        public string href { get; set; }

        XmlAttribute]
        public string rel { get; set; }

        [XmlAttribute]
        public string title { get; set; }
        }
    }
}

次のように REST エンドポイントを呼び出します。

string path = String.Format("account/{0}", id);
HttpResponseMessage response = client.GetAsync(path).Result;  // Blocking call!
if (response.IsSuccessStatusCode)
{
    // Parse the response body. Blocking!
    account = response.Content.ReadAsAsync<Models.account.response.Account>().Result;
}

Account オブジェクトのフィールドを調べます。すべてが null であるか、初期化された値にデフォルト設定されています。

Global.asax.cs の Application_Start メソッドで、XML シリアライザーを登録しています。

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
4

1 に答える 1

0

これを処理するより簡単な方法は、すべての逆シリアル化を行うRestSharp ライブラリを使用することです。これにより呼び出しが簡素化され、モデルに XML 属性が必要なくなります。

RestSharp で aync 呼び出しを行う良い例については、こちらをご覧ください。

Windows Phone 7 で RestSharp を使用して ExecuteAsync を実装するにはどうすればよいですか?

うまくいけば、これが役に立ちます。

于 2013-04-26T21:41:06.837 に答える