代码之家  ›  专栏  ›  技术社区  ›  aepheus

优化httpwebresponse-getresponse

  •  0
  • aepheus  · 技术社区  · 15 年前

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

    …继续生成一个XML文档,在其中添加更多的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);
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Community CDub    8 年前

    我发现我使用的方案有一个重大改进。而不是使用streamreader和readtoend将流转换为字符串,然后将其转换为XML文档。我跳过了中间人,将流直接转换为XML文档。

    但是,这给我带来了另一个问题,我必须更改XML文档的父级以适应我的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);
    }