httpwebresponse 최적화 - GetResponse
-
19-09-2019 - |
문제
다음 줄의 코드를 사용하여 비동기 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);
}
제휴하지 않습니다 StackOverflow