私は初めて ASP.NET Web API に足を踏み入れましたが、大きな不満を引き起こしている問題があります。
私が呼び出している RESTful サービスは、次のようなデータを返します。
<SearchResults xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Results>
<Result>
<Title>foo</Title>
</Result>
<Result>
<Title>bar</Title>
</Result>
</Results>
<NumberOfResults>2</NumberOfResults>
</SearchResults>
そこで、このデータを表すエンティティをいくつか作成しました。
[Serializable, DataContract(Namespace = "")]
public class SearchResults
{
public List<Result> Results { get; set; }
public int NumberOfResults { get; set; }
}
[Serializable, DataContract(Namespace = "")]
public class Result
{
public string Title { get; set; }
}
そして、データを逆シリアル化しようとしました:
var client = new HttpClient();
client.BaseAddress = new Uri("some uri");
var response = client.GetAsync("/some/path/").Result;
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsAsync<SearchResults>().Result;
結果が返されることはわかっていても、Results = null および NumberOfResults = 0 の SearchResults オブジェクトになり、response.Content.ReadAsStringAsync() をチェックすると、XML には期待どおりの結果が含まれます。
私は代わりに試しました:
var serializer = new XmlSerializer(typeof(SearchResults));
var results = (SearchResults)serializer.Deserialize(response.Content.ReadAsStreamAsync().Result);
そして、完全に入力された SearchResults オブジェクトが返されました。
最後に、単純な IFormatterLogger を実装して、それを ReadAsAsync に渡してみました。これは、ストリームを 2 回読み取ろうとすると呼び出されました (予想どおり!)。
XmlSerializer を使用して、それが機能するのでスチームに渡すこともできますが、それは ReadAsAsync を使用するほどきちんと整頓されているようには見えません。さらに、何が間違っているのかを本当に知りたいです:)
2012 年 9 月 3 日 16:38 更新
わかりました、Web API を使用する際に非常に重要な何かが明らかに欠けていますが、まだ何がわかりません!
PUT 動詞でサービスを消費しようとしましたが、XmlSerializer を使用してテストしたときにエンティティが適切にシリアル化されていましたが、リクエストは HTTP 500 で失敗していました。Fiddler で送信されたものを確認し、Web API によって生成された XML XmlSerializer によって生成されるようなものはありません。まず、単に「名前」ではなく、「_x003C_Name_x003E_k__BackingField」のような名前が付いています。