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

私が使用していたスキームに 1 つの大きな改善点が見つかりました。StreamReader と ReadToEnd を使用して Stream を文字列に変換するのではなく、それを XmlDocument に変換します。仲介者をスキップして、ストリームを直接 XmlDocument に変換しました。

ただし、これにより別の問題が発生しました。XmlDocument の親を Xslt に合わせて変更する必要がありました (非常に多くのものがあり、すべてが私が持っていた構造を期待しています)。C# XmlDocument に新しいルート要素を追加するにはどうすればよいですか? を参照してください。その修正のために。

これにより、Web サービス呼び出しの結果を処理するのにかかる時間が約 2/3 短縮され、使用されるメモリ量が大幅に減少しました。以前のバージョンでは、応答 xml は 2 回 (ストリームがカウントされる場合は 3 回) メモリ内にありました!

さらに、余分な 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 に答える