我实现了一个向我的REST服务发出POST请求的方法。它使用XML序列化序列化传递的对象,但在服务器端,一半属性变为null,前3个属性保留值。
我检查了所有使用XMLElement属性修饰的类属性。使用较小的大小(三个属性)调用此方法可以正常工作,但是当我传递具有7/8属性的class-object时,会导致上述问题。这是我的方法:(这段代码是为.NET Compact framework 3.5编写的,虽然我将相同的代码粘贴到.NET 4.0类库项目中,它给了我同样的错误。所以Compact Framework似乎不是一个问题) 。
public static object Post<T>(string uri, T paramObj)
{
string baseURI = InfraHelper.BaseURI;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseURI + uri);
req.Method = "POST";
req.ContentType = "application/xml; charset=utf-8";
req.Timeout = 30000;
req.AllowWriteStreamBuffering = true;
Encoding enc = new UTF8Encoding(false);
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(req.GetRequestStream(), enc))
{
XmlSerializer serializer = new XmlSerializer(typeof(T), "http://www.123insight.com/InsightHandHeldDeviceSvc");
serializer.Serialize(sw, paramObj);
sw.Flush();
}
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
// Retrieve response stream and wrap in StreamReader
string strResp = string.Empty;
using (Stream respStream = resp.GetResponseStream())
{
StreamReader rdr = new StreamReader(respStream);
strResp = rdr.ReadToEnd();
rdr.Close();
}
XElement xDoc = XElement.Parse(strResp);
XNamespace ns = xDoc.Name.Namespace;
var node = from compileItem in xDoc.Elements(ns + "Value")
select compileItem.Value;
return node.First().ToString();
}
我的服务方法装修精良
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "AdjustStock",
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare)]
public PostResponse AdjustStock(AdjustStockRequestDTO adjStockDTO)
{
非常感谢任何朋友的帮助,我整天浪费在这里:( 我也尝试过指定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;
其余代码与上面相同。现在它失败了超时异常,并且调用没有到达服务器..
答案 0 :(得分:0)
WCF REST对XML的使用存在一些反序列化问题。 我切换到JSON。 for .NET CF 3.5我正在使用来自http://json.codeplex.com/的解决方案(CF版本为3.5) 它对我来说很好。
以下主题帮助我走Json方式: - Null values for object properties de-serialized by WCF
不确定为什么这样明显的XML-Desalinization应该在WCF-REST服务端出现这样的问题。 此问题也不是CF特定的,因为REST svc是在服务器上托管的,我尝试使用与普通WinForm客户端相同的方法调用。 如果有人有更好的答案......同时JSON摇滚
答案 1 :(得分:0)
您需要在DataContract中声明Order for 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; }
}