2010-02-09 31 views
0

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

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

为了回答这个问题,您需要收集更多信息。延迟发生在客户端还是服务器上?你提到你需要创建一个XML文档 - 服务器是即时生成这个文档还是从磁盘提供文档? 您正在浏览代理? 您使用的是身份验证吗? 你使用Tcp保持连接吗?与此相关的是,这个请求是在一个循环中完成的,还是这是一个一次性的应用程序,只是这个请求并结束? 显示您如何创建请求的代码片段。 我们可以从那里进一步... – feroze 2010-02-10 00:05:53

+0

此外,为什么你再次调用EndGetResponse()然后GetResponse()?这不正确的使用API​​。 – feroze 2010-02-10 02:10:24

+0

一些更多信息: 服务器正在生成xml。 我不使用代理服务器。 通话已通过身份验证。 连接不会保持活动状态。 这些连接是一次性的,每个负载不会有超过一次的连接。 我已经在上面添加了如何创建请求。 – aepheus 2010-02-15 19:50:50

回答

0

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

这给我留下了另一个问题,但是我不得不改变XmlDocument的父类以适合我的Xslt(这里有很多很多,他们都期待着我的结构)。对于该修复,请参阅How can I add new root element to a C# XmlDocument?

这给了我大约2/3的处理web服务调用结果的时间减少,并且使用的内存量大大减少。在以前的版本中,响应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); 
}