【发布时间】: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