Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF-Rest-DataContract:反序列化XML包装的响应_C#_Xml_Rest_Wcf_Deserialization - Fatal编程技术网

C# WCF-Rest-DataContract:反序列化XML包装的响应

C# WCF-Rest-DataContract:反序列化XML包装的响应,c#,xml,rest,wcf,deserialization,C#,Xml,Rest,Wcf,Deserialization,假设我们使用的是返回xml的REST WCF服务 是否可以“自动”反序列化对DataContract的xml包装响应 简单示例 类别: [DataContract] public class TestClass { [DataMember] string StringValue { get; set; } [DataMember] int IntValue { get; set; } } 服务: [OperationContract] [WebGet(UriTe

假设我们使用的是返回xml的REST WCF服务

是否可以“自动”反序列化对DataContract的xml包装响应

简单示例

类别:

[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");
}
反序列化:

// 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);
    }
}
//在或示例中使用T作为TestClass。
公共静态T反序列化(字符串xml)
{
使用(Stream=newmemoryStream())
{
byte[]data=System.Text.Encoding.UTF8.GetBytes(xml);
stream.Write(数据,0,数据长度);
流位置=0;
DataContractSerializer反序列化程序=
新的DataContractSerializer(typeof(T));
return(T)反序列化器。ReadObject(stream);
}
}
此代码适用于裸响应

由于webClient只返回完整的请求,所以输出xml包含包装器元素,DataContractSerializer尝试解析一个简单的字符串,而不是来自WCF包装的响应(应该“忘记”包装器)


目标是构造一个包装样式(裸包装/包装)无关紧要的客户机。

为什么不将输出反序列化为一个简单的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;
}
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]

抱歉,但我的主要目标也有同样的问题:使用包装和裸响应。亲爱的@Manea。请张贴整个答复,以便我可以帮助你。谢谢。请看我示例中的服务:当它设置为BodyStyle=WebMessageBodyStyle.Wrapped时,返回的xml是“Wrapped”,因此反序列化不起作用。我正在寻找一种方法来反序列化WCF生成的Xml,这种方法应该适用于WebMessageBodyStyle.Wrapped和WebMessageBodyStyle.Bare.dear@Manea。问题不在于系列化方法。这是关于输出类的。当您更改BodyStyle时。包装您的输出将发生更改。我不知道您是如何使用web服务的,但是如果您能够捕获输出,您将了解问题所在。