2017-01-25 2 views
0

Предполагая, что мы используем службу REST WCF, возвращающую xml.WCF -Rest- DataContract: Deserialize XML wrapped response

Можно ли десериализовать «автоматически» обработанный 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

Пожалуйста, посмотрите ** сервис ** в моем примере: когда он установлен в BodyStyle = WebMessageBodyStyle.Wrapped, возвращаемый xml «завернут», и поэтому десериализация не работает. Я ищу метод десериализации Xml, сгенерированного WCF, и этот метод должен работать для WebMessageBodyStyle.Wrapped AND WebMessageBodyStyle.Bare. – Manea