Pergunta

Eu estou usando as seguintes linhas de código para ler a resposta de um assíncrona HttpWebRequest. Esta parece ser a maior quantidade de tempo gasto em uma operação particular. Existe algo que eu possa otimizar aqui?

System.Net.HttpWebResponse oResp =(System.Net.HttpWebResponse)oReq.EndGetResponse(oResult);
oResp = (HttpWebResponse)oReq.GetResponse();
StreamReader oStreamReader = new StreamReader(oResp.GetResponseStream());
string sResponse = oStreamReader.ReadToEnd();

... continua a fazer um XmlDocument, acrescentar mais alguns XML para ele, em seguida, executar transformar um XSL.

Criar as ligações:

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);
Foi útil?

Solução

Eu encontrei uma grande melhoria para o esquema que eu estava usando. Ao invés de usar o StreamReader e ReadToEnd para obter o fluxo em uma corda, só então convertê-lo em um XmlDocument. Eu saltei o homem médio e converteu o fluxo diretamente em um XmlDocument.

Isso me deixou com outro problema, porém, eu tive que mudar o pai do XmlDocument para caber minha Xslt (há um grande muitos e todos eles esperam que a estrutura que eu tinha). Consulte Como posso adicionar novo elemento raiz para um C # XmlDocument ? para essa correção.

Isso me deu um 2/3 diminuição aproximadamente no tempo necessário para processar os resultados da chamada webservice, e uma grande diminuição na quantidade de memória utilizada. Na versão anterior, o xml resposta foi na memória dois momentos diferentes (talvez três, se as contagens de fluxo)!

Além disso, a remoção do GetResponse adicional parecia ajuda.

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult))
{
oXml.Load(oResp.GetResponseStream());
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement);
oXml.LoadXml(sOtherXml);
oXml.DocumentElement.AppendChild(oApiResult);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top