2010-02-01 7 views
19

HttpWebRequest를 재사용 할 수 있습니까?HttpWebRequest를 재사용 할 수 있습니까?

사이트에 대한 세 번째 요청으로 인해 작업 시간이 초과 된 것처럼 보입니다. 그것은 각각의 요청이 새로운 연결을 만드는 것처럼 보입니다. 그래서 URL을 변경하고 요청을 다시 받아서 HttpWebRequest를 재사용 할 수 있는지 알고 싶습니다. 문제의 코드는 다음과 같습니다. 이 코드는 URL 범위가 존재하는지 확인합니다.

static void storeList(TextWriter sw, string urlTemplate, int start, int end) 
    { 
     for (int i = start; i < end; i++) 
     { 
      var url = string.Format(urlTemplate, i); 
      var req = (HttpWebRequest)HttpWebRequest.Create(url); 
      { 
       req.Method = "HEAD"; 
       tryHttpWebRequest 
       { 
        var resp = req.GetResponse(); 
        sw.WriteLine(i); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 
     sw.Flush(); 
    } 
+1

당신의 예제 코드에서'HttpWebRequest'를 재사용하고 있지 않습니다 - 당신은'for' 루프 주위에 매번 새로운 것을 만듭니다. – adrianbanks

+0

제가 알고 있듯이 질문은 어떻게 재사용합니까? ;) –

+0

아, 좋아. 나는 당신이 요청을 재사용하고 있음을 보여주고 자 노력했지만 그것이 효과가 없었던 것입니다. – adrianbanks

답변

13

응답에 Close를 호출하면 확인해야합니다. 너무 많은 "열린"연결 만 허용되므로 실패하는 이유는 새 연결을 열 수 없기 때문입니다.

응답을 완료 한 후에는 닫아야합니다. 아무 것도 재사용 할 필요가 없습니다. MSDN article에서

:

당신은 어느 Stream.Close 또는 에 HttpWebResponse.Close 방법은 응답을 닫고 다시 사용할 수 연결을 해제 호출해야합니다. Stream과 HttpWebResponse.Close를 모두 호출하는 데는 이 필요하지 않지만 을 수행하면 오류가 발생하지 않습니다.

+5

@acid & josh -이 게시물의 의미는 (Begin) GetResponse에서 반환 된 응답을 닫을 수 있고 요청을 다시 사용할 수 있지만 테스트가이를 지원하지 않는다는 것입니다. 당신이 대답하는 질문이 무엇인지 분명히하기 위해 몇 가지 코드를 게시 할 수 있다면 좋을 것입니다. –

2

새로 만들면됩니다. .NET 환경 + HTTP 킵 얼라이브 (keepalives)가 내가 믿는 그런 관점에서 당신을 위해 일을 처리해야하므로,이 시나리오에서 효율적인지 걱정하지 않아도됩니다.

아마도 당신은 1) 열린 연결 수에 문제가있는 것일 수 있습니다. 연결을 끊으면 오류가 사라지거나 2) 서버에서 초당 요청 수 제한이있는 문제 (안티 DoS 처리). 우선 # 1을 시도해 봅니다. 간단하고, 여전히 문제가 보이면 서버가 요청을 받고 있지만 거부하고 있는지 확인하십시오.

2

는 연결이 항상 닫혀 있는지 확인하기 위해 사용하는 문에 응답 전화를 랩 :

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url) 
// ... 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    // ... 
} 

또한 사용 성명에서 어떤하면 GetResponseStream()를 포장.

+0

IIRC 응답에 IDispose가 없습니다. 나는 질문을 게시하기 전에 그것을 시도했다. 해결 방법은 각 루프의 끝에 .close를 사용하는 것입니다. –

+0

@ acidzombie24, HttpWebResponse : WebResponse : IDisposable, [.NET 1.1 이후로 완료되었습니다.] (https://msdn.microsoft.com/en-us/library/) system.net.webresponse % 28v = vs.71 % 29.aspx). –

관련 문제