我正在使用以下代码行来读取异步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);
答案 0 :(得分:0)
我发现我正在使用的方案有一个重大改进。而不是使用StreamReader和ReadToEnd将Stream转换为字符串,然后才将其转换为XmlDocument。我跳过了中间人并将Stream直接转换为XmlDocument。
这给我留下了另一个问题,我不得不更改XmlDocument的父级以适应我的Xslt(有很多很多,他们都期望我的结构)。有关该修复程序,请参阅How can I add new root element to a C# XmlDocument?。
这使我处理webservice调用结果所花费的时间大约减少了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);
}