2017-01-25 6 views
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がラップされたレスポンス(ラッパーを "忘れる")にはなりません。

目標は、ラッピングスタイル(裸/ラップ)が問題にならないクライアントを作成することです。

答えて

0

出力を単純なXMLとしてデシリアライズしてみませんか?

public static T XmlDeserializer<T>(string xmlString) 
{ 
     var instance = default(T); 
     var xmlSerializer = new XmlSerializer(typeof(T)); 
     using (var stringreader = new StringReader(xmlString)) 
      instance = (T)xmlSerializer.Deserialize(stringreader); 

     return instance; 
} 

注:あなたはこのようなあなたのクライアント側のクラスに名前空間を使用する必要があるため、デフォルトのxmlnsタグ:このような何か

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")] 
+0

申し訳ありませんが、それは私の主な目標と同じ問題である:仕事ラップして裸の応答で。 – Manea

+0

親愛なる@Manea。私はあなたを助けることができるように全体の回答を投稿してください。ありがとう。 – David

+0

私の例で** service **を見てください:BodyStyle = WebMessageBodyStyle.Wrappedに設定されている場合、返されるXMLは「ラップされている」ため、逆シリアル化は機能しません。私は、WCFで生成されたXMLを逆シリアル化するメソッドを探しています。このメソッドはWebMessageBodyStyle.WrappedとWebMessageBodyStyle.Bareで機能するはずです。 – Manea

関連する問題