C# HttpWebREquest XmlSerialization POST请求向REST服务发送部分空属性

C# HttpWebREquest XmlSerialization POST请求向REST服务发送部分空属性,c#,xml-serialization,httpwebrequest,C#,Xml Serialization,Httpwebrequest,我实现了一个向我的REST服务发出POST请求的方法。它使用XML序列化来序列化传递的对象,但在服务器端,一半属性变为null,前3个属性保留值 我检查了所有用XMLElement属性修饰好的类属性。使用较小的大小(三个属性)调用此方法可以很好地工作,但当我传递带有7/8属性的类对象时,它会导致上述问题。这是我的方法:(这段代码是为.NET Compact framework 3.5编写的,虽然我将相同的代码复制粘贴到.NET 4.0类库项目中,但它给了我相同的错误。因此Compact fram

我实现了一个向我的REST服务发出POST请求的方法。它使用XML序列化来序列化传递的对象,但在服务器端,一半属性变为null,前3个属性保留值

我检查了所有用XMLElement属性修饰好的类属性。使用较小的大小(三个属性)调用此方法可以很好地工作,但当我传递带有7/8属性的类对象时,它会导致上述问题。这是我的方法:(这段代码是为.NET Compact framework 3.5编写的,虽然我将相同的代码复制粘贴到.NET 4.0类库项目中,但它给了我相同的错误。因此Compact framework似乎不是问题)

非常感谢朋友们的帮助,我在这里浪费了一整天:( 我还尝试指定req.ContentLength=length;为了计算长度,我使用了以下方法:-

Encoding enc = new UTF8Encoding(false);
            XmlSerializer serializer1 = new XmlSerializer(typeof(T), "http://www.xxx.com/xxx");    
            StringWriter sw1 = new StringWriter();
            serializer1.Serialize(sw1, paramObj);
            string data = sw1.ToString();
            sw1.Close();

            byte[] byteArray = enc.GetBytes(data);
            int length = byteArray.Length;

代码的其余部分与上面相同。现在由于超时异常而失败,并且调用未到达服务器。

WCF rest使用XML存在一些反序列化问题。 我切换到JSON。 对于.NET CF 3.5,我使用的解决方案来自(CF的3.5版本) 这对我来说很好

以下线程帮助我走Json之路:-

不知道为什么如此明显的XML淡化在WCF-REST服务端会有这样的问题。 另外,这个问题并不是特定于CF的,因为REST svc托管在服务器上,我尝试使用与普通WinForm客户端相同的方法调用它。
如果有人有更好的答案,您需要在DataContract中声明DataMember属性的顺序。如果您的客户端正在发送xml请求,这是必要的。 比如说

  [Serializable]
  [DataContract(Namespace = Utils.DataNamespace)]
  public class Detail 
  {
    [DataMember(Order = 1)] 
    public string LineNbr { get; set; }

    [DataMember(Order = 2)]
    public string UPC { get; set; }

    [DataMember(Order = 3)] 
    public string SkuNbr { get; set; }
 }

为什么要使用HttpWebRequest调用WCF服务而不是使用生成的客户端代理?您好,Darin,客户端是.NET Compact Framework 3.5版,ChannelFactory不适用于CF:(
Encoding enc = new UTF8Encoding(false);
            XmlSerializer serializer1 = new XmlSerializer(typeof(T), "http://www.xxx.com/xxx");    
            StringWriter sw1 = new StringWriter();
            serializer1.Serialize(sw1, paramObj);
            string data = sw1.ToString();
            sw1.Close();

            byte[] byteArray = enc.GetBytes(data);
            int length = byteArray.Length;
  [Serializable]
  [DataContract(Namespace = Utils.DataNamespace)]
  public class Detail 
  {
    [DataMember(Order = 1)] 
    public string LineNbr { get; set; }

    [DataMember(Order = 2)]
    public string UPC { get; set; }

    [DataMember(Order = 3)] 
    public string SkuNbr { get; set; }
 }