【问题标题】:HttpWebREquest XMLSerialzation POST request sending partially null properties to REST serviceHttpWebREquest XMLSerialzation POST 请求将部分空属性发送到 REST 服务
【发布时间】:2013-03-16 06:33:50
【问题描述】:

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

我检查了所有用 XMLElement 属性修饰的类属性。使用较小的尺寸(三个属性)调用此方法可以正常工作,但是当我传递具有 7/8 属性的类对象时,它会导致上述问题。这是我的方法:(此代码是为 .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();

    }

我的Service方法装饰得很好

 [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;

其余代码同上。现在它因超时异常而失败,并且调用未到达服务器..

【问题讨论】:

  • 为什么使用 HttpWebRequest 调用 WCF 服务而不是使用生成的客户端代理?
  • 嗨 Darin,客户端是 .NET Compact Framework 3.5 版,并且 ChannelFactory 不适用于 CF :(

标签: c# xml-serialization httpwebrequest


【解决方案1】:

WCF REST 使用 XML 存在一些反序列化问题。 我切换到 JSON。 对于 .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 摇滚

【讨论】:

    【解决方案2】:

    您需要在 DataContract 中为 DataMember 属性声明 Order。如果您的客户端正在发送 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; }
     }
    

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 2017-05-04
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多