C# HttpWebREquest XmlSerialization POST请求向REST服务发送部分空属性
我实现了一个向我的REST服务发出POST请求的方法。它使用XML序列化来序列化传递的对象,但在服务器端,一半属性变为null,前3个属性保留值 我检查了所有用XMLElement属性修饰好的类属性。使用较小的大小(三个属性)调用此方法可以很好地工作,但当我传递带有7/8属性的类对象时,它会导致上述问题。这是我的方法:(这段代码是为.NET Compact framework 3.5编写的,虽然我将相同的代码复制粘贴到.NET 4.0类库项目中,但它给了我相同的错误。因此Compact framework似乎不是问题) 非常感谢朋友们的帮助,我在这里浪费了一整天:( 我还尝试指定req.ContentLength=length;为了计算长度,我使用了以下方法:-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
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; }
}