문제

다음 줄의 코드를 사용하여 비동기 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);
도움이 되었습니까?

해결책

나는 내가 사용하고있는 체계의 주요 개선을 발견했다. 스트림 리더를 사용하고 readtoend를 사용하여 스트림을 문자열로 가져 오는 대신 xmldocument로만 변환합니다. 나는 중간 맨을 건너 뛰고 스트림을 XMLDocument로 직접 변환했습니다.

이것은 또 다른 문제를 남겼습니다. XMLDocument의 부모를 XSLT에 맞게 변경해야했습니다 (많은 사람들이 있고 모두 내가 가진 구조를 기대합니다). 보다 c# xmldocument에 새 루트 요소를 추가하려면 어떻게해야합니까? 그 수정을 위해.

이로 인해 웹 서비스 호출의 결과를 처리하는 데 걸리는 시간이 약 2/3 감소하고 사용 된 메모리의 양이 크게 감소했습니다. 이전 버전에서 응답 XML은 두 번 다른 메모리에있었습니다 (스트림이 계산되는 경우 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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top