Я обнаружил одно существенное улучшение схемы, которую я использовал. Вместо того чтобы использовать StreamReader и ReadToEnd, чтобы получить Stream в строку, только затем преобразовать его в XmlDocument. Я пропустил посредника и превратил Stream прямо в XmlDocument.
Это оставило меня с другой проблемой, хотя мне пришлось изменить родителя XmlDocument, чтобы он соответствовал моему Xslt (их очень много, и все они ожидают структуру, которую я имел). См. Как добавить новый корневой элемент в C # XmlDocument? для этого исправления.
Это дало мне примерно 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);
}