【问题标题】:Optimizing HttpWebResponse - GetResponse优化 HttpWebResponse - GetResponse
【发布时间】:2010-02-09 18:29:41
【问题描述】:

我正在使用以下代码行来读取异步 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);

【问题讨论】:

  • 为了回答这个问题,您需要收集更多信息。延迟发生在客户端还是服务器上?您提到您需要创建一个 XML 文档 - 服务器是动态生成此文档,还是从磁盘提供文档?你是通过代理吗?你在使用身份验证吗?您是否使用 Tcp 保持活动连接?与此相关的是,这个请求是在循环中完成的,还是一个一次性的应用程序,只发出这个请求并结束?显示您如何创建请求的代码 sn-p。我们可以从那里走得更远..
  • 另外,你为什么要调用 EndGetResponse() 再调用 GetResponse() ?这不是 API 的正确用法。
  • 更多信息:服务器正在动态生成 xml。我不使用代理。调用经过身份验证。连接不保持活动状态。连接是一次性的,每次负载不超过一个连接。我已经在上面添加了请求的创建方式。
  • 第一个问题的答案,看起来几乎所有时间都花在了字符串 sResponse = oStreamReader.ReadToEnd();行,因此在客户端上。

标签: optimization httpwebrequest httpwebresponse getresponse


【解决方案1】:

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

这给我留下了另一个问题,我不得不更改 XmlDocument 的父级以适应我的 Xslt(有很多,他们都期望我拥有的结构)。有关该修复,请参阅 How can I add new root element to a 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);
}

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2012-11-24
    • 1970-01-01
    • 2011-04-22
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多