Я реализовал метод, который делает 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;
остальная часть кода такая же, как указано выше. Теперь происходит сбой с исключением из-за тайм-аута, и вызов не достигает сервера.