0

我正在使用以下代码行来读取异步 HttpWebRequest 的响应。这似乎是在特定操作中花费的最大时间。有什么我可以在这里优化的吗?

System.Net.HttpWebResponse oResp =(System.Net.HttpWebResponse)oReq.EndGetResponse(oResult);
oResp = (HttpWebResponse)oReq.GetResponse();
StreamReader oStreamReader = new StreamReader(oResp.GetResponseStream());
string sResponse = oStreamReader.ReadToEnd();

...继续创建一个 XmlDocument,向其附加更多 XML,然后执行 XSL 转换。

创建连接:

HttpWebRequest oReq;
oReq = (HttpWebRequest)WebRequest.Create(sUrl + sQueryString);
oReq.ContentType = sContentType;
oReq.Method = "POST";
oReq.ContentLength = aBytes.Length;
Stream oStream = oReq.GetRequestStream();
oStream.Write(aBytes, 0, aBytes.Length);
oStream.Close();
AsyncState oState = new AsyncState(oReq);
return oReq.BeginGetResponse(fCallBack, oState);
4

1 回答 1

0

我发现我正在使用的方案有一项重大改进。而不是使用 StreamReader 和 ReadToEnd 将 Stream 转换为字符串,然后才将其转换为 XmlDocument。我跳过了中间人,直接将 Stream 转换为 XmlDocument。

不过,这给我留下了另一个问题,我不得不更改 XmlDocument 的父级以适应我的 Xslt(有很多而且他们都期望我拥有的结构)。请参阅如何将新的根元素添加到 C# XmlDocument?对于那个修复。

这使我处理 web 服务调用结果的时间减少了大约 2/3,并且使用的内存量大大减少。在以前的版本中,响应 xml 在内存中有两次不同的时间(如果流计数,可能是三次)!

此外,删除额外的 GetResponse 似乎也有所帮助。

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult))
{
oXml.Load(oResp.GetResponseStream());
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement);
oXml.LoadXml(sOtherXml);
oXml.DocumentElement.AppendChild(oApiResult);
}
于 2010-02-15T22:51:10.530 回答