0
xmlを返すREST WCFサービスを使用していると仮定します。WCF -Rest- DataContract:XMLラップされたレスポンスをデシリアライズ
xmlでラップされたレスポンスをDataContractに「自動的に」デシリアライズすることはできますか?
簡単な例
クラス:
[DataContract]
public class TestClass
{
[DataMember]
string StringValue { get; set; }
[DataMember]
int IntValue { get; set; }
}
サービス:
[OperationContract]
[WebGet(UriTemplate = "Test",
BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
TestClass Test();
クライアント:
using (WebClient webClient = new WebClient())
{
webClient.Headers["Content-type"] = "application/xml";
webClient.Encoding = Encoding.UTF8;
return webClient.DownloadString($"{BASE_URL}/Test");
}
Deserializa
// With T as TestClass in or example.
public static T Deserialize<T>(string xml)
{
using (Stream stream = new MemoryStream())
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(data, 0, data.Length);
stream.Position = 0;
DataContractSerializer deserializer =
new DataContractSerializer(typeof(T));
return (T)deserializer.ReadObject(stream);
}
}
このコードは、裸の応答に適しています。
WebClientが完全な要求を返すだけで、出力XMLにthreラッパー要素が含まれていて、DataContractSerializerが単純な文字列を解析しようとしましたが、WCFがラップされたレスポンス(ラッパーを "忘れる")にはなりません。
目標は、ラッピングスタイル(裸/ラップ)が問題にならないクライアントを作成することです。
申し訳ありませんが、それは私の主な目標と同じ問題である:仕事ラップして裸の応答で。 – Manea
親愛なる@Manea。私はあなたを助けることができるように全体の回答を投稿してください。ありがとう。 – David
私の例で** service **を見てください:BodyStyle = WebMessageBodyStyle.Wrappedに設定されている場合、返されるXMLは「ラップされている」ため、逆シリアル化は機能しません。私は、WCFで生成されたXMLを逆シリアル化するメソッドを探しています。このメソッドはWebMessageBodyStyle.WrappedとWebMessageBodyStyle.Bareで機能するはずです。 – Manea