HttpWebREquest POST-запрос XMLSerialization, отправляющий частично нулевые свойства в службу REST - PullRequest
0 голосов
/ 05 октября 2011

Я реализовал метод, который делает POST-запрос к моим службам REST. Он сериализует переданный объект с использованием 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();

    }

Мой метод обслуживания хорошо оформлен

 [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 голосов
/ 16 марта 2013

Вам необходимо объявить Порядок для атрибутов DataMember в DataContract. Это необходимо, если ваш клиент отправляет 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; }
 }
0 голосов
/ 06 октября 2011

WCF REST использование XML имеет некоторые проблемы десериализации. я переключился на JSON. для .NET CF 3.5 Я использую решение от http://json.codeplex.com/ (версия 3.5 для CF) и это работает нормально для меня.

Следующая тема поможет мне пойти по пути Джсон: - Нулевые значения для свойств объекта, десериализованных WCF

Не уверен, почему такая очевидная рассоление XML должно иметь такую ​​проблему на стороне службы WCF-REST. Также эта проблема не была специфичной для CF, так как REST svc был размещен на сервере, и я попытался вызвать тот же метод с обычным клиентом WinForm. Если у кого-то есть лучший ответ ... тем временем JSON качает

...