2017-05-01 3 views
0

연결을 생성 한 후 ID를 보내고 응답을 저장 한 다음, 다시 보내고 (일반적으로 ~ 60-100 ID) 보내야합니다. 현재 나는 이렇게했습니다 :WebRequest 다중 쓰기 및 읽기

public void EThread() 
{ 
    HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL); 
    HWRequest.Method = "POST"; 
    HWRequest.ContentType = "text/xml; encoding='utf-8'"; 

    string StrID; 

    while(!_RequiredIDs.IsEmpty) 
     if (_RequiredIDs.TryDequeue(out StrID)) 
      Extract(StrID, ref HWRequest); 
} 

public void Extract(string ID, ref HttpWebRequest HWRequest) 
{ 
    string data = "strID=" + ID; 
    byte[] Bytes = Encoding.ASCII.GetBytes(data); 

    using (Stream SWriter = HWRequest.GetRequestStream()) 
    { 
     SWriter.Write(Bytes, 0, Bytes.Length); 
     SWriter.Close(); 
    } 

    HttpWebResponse resp = (HttpWebResponse)HWRequest.GetResponse(); 

    using (Stream s = resp.GetResponseStream()) 
    using (StreamReader sr = new StreamReader(s)) 
     _RespnseCollection.Enqueue(sr.ReadToEnd()); 
} 

그러나이 오류 : System.Net.WebException: 'The request was aborted: The connection was closed unexpectedly.이 있습니다. Extract 메서드 안에 HttpWebRequest를 넣으면 작동하지만 오래 작동합니다. 이것은 1 개의 스레드에서 검사되었습니다. 코드가 잘못되었거나 서버가이를 지원하지 않습니다.

+0

그것이 works' 추출 방법 안에'내가 넣으면 HttpWebRequest를하여 무엇을 의미합니까. 메소드를 호출 할 때마다 새로운 HttpWebRequest 객체를 '다시 생성'한다는 것을 의미합니까? 현재 사용중인 코드에서 처음 사용 후 요청 스트림이 닫히면 후속 호출에 오류가 발생합니다. –

+0

예, 매번 '다시 작성'하지만 실행하고 싶지 않습니다. 나는 또한'SWriter.Close()'를 제거한다. 같은 오류. 'WebClient'와 함께 사용 된 제시된 접근법 - 모든 것이 좋지만,이 목적을 위해서'WebClient'는 충분하지 않습니다. –

+0

한 번에 모든 ID를 보낼 수 있습니까? –

답변

0

문제는 HWRequest를 다시 사용하는 것입니다. 그러나 HttpWebRequest은 일회용 항목입니다. 즉, 요청을 한 번만 실행할 수 있습니다. THR _RequiredIDs 하나 이상의 항목이 포함 된 경우

그래서 첫 번째 항목이 제대로 작동하지만, 완료에 HwRequest의 상태를 변경 (즉 지금 응답을 포함)과 HaveResponse 속성이 true로 설정됩니다.

GetRequestStream() 또는 GetResponse()을 다시 실행하면 이미 응답을 받았으므로 요청을 다시 설정하는 것이 적절하지 않다고 판단됩니다.

그래서 다음과 같이 코드를 수정할 수 :

public void EThread() 
{ 

    string StrID; 

    while(!_RequiredIDs.IsEmpty) 
     if (_RequiredIDs.TryDequeue(out StrID)) 
     { 
      HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL); 
      HWRequest.Method = "POST"; 
      HWRequest.ContentType = "text/xml; encoding='utf-8'"; 
      Extract(StrID, ref HWRequest); 
     } 
} 

을하지만, 나는이 정말 상응하는 기능을 HttpRequest를 선언하고 Extract 방법 내부 초기화하는 가정하자.

SUGGESTIION : HWRequest.Reset()를 호출보십시오 :

public void EThread() 
{ 
    HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL); 
    HWRequest.Method = "POST"; 
    HWRequest.ContentType = "text/xml; encoding='utf-8'"; 

    string StrID; 

    while(!_RequiredIDs.IsEmpty) 
     if (_RequiredIDs.TryDequeue(out StrID)) 
     { 
      Extract(StrID, ref HWRequest); 
      HWRequest.Reset(); 
     } 
} 
+0

네, 동일합니다. 서버는 연결에 다소 시간이 걸리므로 가능한 경우 연결을 다시 사용하고 싶습니다. 그렇지 않으면 최적의 스레드 다운로드 양을 찾습니다. –

+0

하지만 여기에서 직면 한 핵심 문제 인 'HttpWebRequest'로 연결을 다시 사용할 수는 없습니다. –

+0

다른 대안? 'WebClient'를 사용할 때 제대로 작동하고 속도가 빨라 졌다고 생각합니다. 그러나 여기서'WebClient'를 사용할 수는 없습니다. –