HttpWebREquest XMLSerialzation POST请求将部分空属性发送到REST服务

时间:2011-10-04 20:17:25

标签: c# xml-serialization httpwebrequest

我实现了一个向我的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;

其余代码与上面相同。现在它失败了超时异常,并且调用没有到达服务器..

2 个答案:

答案 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; }
 }