2011-02-08 6 views
9

a specific issue with my ASP.NET application을 디버그하려고합니다.서버와의 연결을 끊지 않고 HttpWebRequest를 다시 사용할 수 있습니까?

void uploadFile(string serverUrl, string filePath) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest. 
     Create(serverUrl); 
    CredentialCache cache = new CredentialCache(); 
    cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("User", "pass")); 
    request.Credentials = cache; 
    request.Method = "POST"; 
    request.ContentType = "application/octet-stream"; 
    request.Timeout = 60000; 
    request.KeepAlive = true; 

    using(BinaryReader reader = new BinaryReader( 
     File.OpenRead(filePath))) { 

     request.ContentLength = reader.BaseStream.Length; 
     using(Stream stream = request.GetRequestStream()) { 
      byte[] buffer = new byte[1024]; 
      while(true) { 
       int bytesRead = reader.Read(buffer, 0, buffer.Length); 
       if(bytesRead == 0) { 
        break; 
       } 
       stream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 

    HttpWebResponse result = (HttpWebResponse)request.GetResponse(); 
    //handle result - not relevant 
} 

Write()가에 예외가 발생합니다 : 클라이언트는 다음과 같은 코드를 실행 "전송 연결에 데이터를 기록 할 수 없습니다. 설정된 연결이 호스트 컴퓨터의 소프트웨어에 의해 중단되었다" 본문. System.Net tracing을 사용했는데 Content-Length과 함께 요청을 보내면 문제가 있다는 것을 알았습니다. 내가 서버 위의 코드에 using 문 안에 모든 것을 생략하면

은 특히 신속 WWW-Authenticate로 응답하고 클라이언트는 WWW-Authenticate로 요청을 재 게시하고 모든 업로드되지에서 파일을 제외하고 잘 가고 요청이 훨씬 나중에 실패합니다.

다음을 수행하고 싶습니다. 데이터없이 요청을 보내고 WWW-Authenticate을 기다린 다음 WWW-Authenticate 및 데이터를 사용하여 반복하십시오. 그래서 위의 코드를 수정하려고 : 우선 모든 매개 변수를 설정 한 다음 GetResponse()을 호출 한 다음 전송을 시도하지만 ContentLength 속성을 설정하려고하면 "이 속성은 쓰기가 시작된 후에 설정할 수 없습니다."라는 텍스트와 함께 예외가 발생합니다.

그래서 HttpWebRequest은 재사용 할 수없는 것 같습니다.

연결을 닫지 않고 요청을 다시 보내려면 어떻게 다시 사용합니까?

+0

나는 또한 동일한 문제가있다. 솔루션을 얻은 경우 수정 된 새 코드를 제공하거나 표시하여 도움이 될 것입니다. – Herin

+0

@Herin : 인증 코드를 nonce와 함께 사용하면 해결할 수 없습니다. 기본 인증과 같은 것을 사용한다면 "인증"헤더를 설정하여'WWW-Authenticate '단계가 없도록 할 수 있습니다. – sharptooth

+0

하지만 나는 'stream.Write (buffer, 0, bytesRead)'줄에 오류가있다. 그런 다음 그 해결 방법은 무엇인가. 좀 더 잘 이해할 수 있도록 수정 된 코드를 제공해 주실 수 있습니까? 고마워요 – Herin

답변

16

요청을 다시 사용하지 마십시오. 이름에서 알 수 있듯이 하나의 요청입니다. 그러나 동일한 호스트에 대해 여러 요청을 실행하면 .NET은 기본적으로 기본 네트워크 연결을 다시 사용합니다. 당신이 request.GetResponse에 의해 반환 된 WebResponse 처분 할 필요성을

주 - 그렇지 않으면 기본 인프라는 당신이 실제로 그것으로 완료 있음을 알 수 없습니다, 연결을 다시 사용할 수 없습니다.

(제외, 왜 BinaryReader를 사용하여 AS가? 그냥 직접 File.OpenRead에 의해 반환 된 스트림을 사용합니다.)

+0

WebResponse 처리를 보증 할 수 있습니다. 내 응용 프로그램 중 하나에서 WebResponse를 처리하지 않았고 몇 가지 HttpWebRequests를 인스턴스화했기 때문에 불쾌한 메모리 누수가 발생했습니다. – jlafay

+0

공정하지만 다른 문제를 해결하기 위해 어떤 메커니즘을 사용할 수 있습니까? 특히 인증을 받고 동일한 WWW-Authenticate를 다시 사용해야합니까? – sharptooth

+0

@sharptooth : 응답에서 헤더를 가져 와서 다음 요청에 사용할 수없는 이유는 명확하지 않습니다. 왜 당신은 같은 객체를 재사용해야한다고 생각합니까? –

2

을 존 소총의 대답 이외에, 당신은 수동으로 ContentLength 속성을 설정할 필요가 없습니다. HttpWebRequest는 자동으로 해당 속성을 계산하고 채 웁니다.

관련 문제