2010-08-10 4 views
1

Response에서 응답하는 서버에 .net 및 POST 데이터의 WebRequest 클래스를 사용하고 있습니다.WebRequest 문제, request-body 앞의 응답

wierd는 네트워크 트래픽을 분석하기 위해 피들러를 시작했을 때 작동하지만 피들러가 없으면 작동하지 않습니다.

그래서 WireShark를 사용하여 컴퓨터로 보내고받는 패키지를 분석하기 시작했습니다. 이 프로그램에서는 TCP 스트림을 따르는 것이 간단합니다. 그래서 피들러를 사용하면 올바른 Request-header/body가 보내지는 것을 볼 수 있으며 Response-header/body를 가져옵니다. 이상한 부분은 Request-Header가 보내지는 피들러를 사용하지 않을 때입니다. 그리고 나서 Response-header/body와 TCP-stream의 마지막에있는 request-body를 얻었습니다.

string lcUrl = "http://XX.XX.XXX.XX"; 

     // *** Establish the request 

     HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 

     string lcPostData = testdata; 

     loHttp.Method = "POST"; 

     byte [] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData); 

     loHttp.ContentLength = lbPostBuffer.Length; 

     loHttp.Credentials = CredentialCache.DefaultCredentials; 

     //loHttp.SendChunked = true; 

     loHttp.ServicePoint.Expect100Continue = false; 

     Stream loPostData = loHttp.GetRequestStream(); 

     loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length); 

     loPostData.Close(); 

     HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse(); 

     Encoding enc = System.Text.Encoding.GetEncoding(1252); 

     StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc); 

     string lcHtml = loResponseStream.ReadToEnd(); 

     loWebResponse.Close(); 

     loResponseStream.Close(); 
+0

아마도 도움이 될 것입니다. http://stackoverflow.com/questions/18126941/c-sharp-webrequest-post-and-getresponse – xameeramir

답변

2

다음 코드를 사용하십시오 :

여기에 내 코드 내가 정성 들여 왔습니다이다. 기본 스트림이 원격 서버로 전송 될 때 시간 문제가있는 것으로 보입니다.

string lcUrl = "http://XX.XX.XXX.XX"; 
// *** Establish the request 
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 
string lcPostData = testdata; 
loHttp.Method = "POST"; 
byte[] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData); 
loHttp.ContentLength = lbPostBuffer.Length; 
loHttp.Credentials = CredentialCache.DefaultCredentials; 
//loHttp.SendChunked = true; 
loHttp.ServicePoint.Expect100Continue = false; 
using (Stream loPostData = loHttp.GetRequestStream()) 
{ 
    loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length); 
} 
string lcHtml; 
using (HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse()) 
{ 
    Encoding enc = System.Text.Encoding.GetEncoding(1252); 
    using (StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc)) 
    { 
     lcHtml = loResponseStream.ReadToEnd(); 
    }    
} 
// Perform processing of data here.... 

또한 다음 코드를 애플리케이션의 app.config 파일에 추가하는 것이 좋습니다. 이것은 서버가 .NET에서 HTTP 요청을 처리하는 방식을 따르지 않는 응답을 반환 할 때 도움이됩니다.

<configuration> 
<system.net> 
<settings> 
<httpWebRequest 
useUnsafeHeaderParsing="true" 
/> 
</settings> 
</system.net> 
</configuration> 
+0

죄송하지만,별로 도움이되지 않았습니다. 결과는 이전처럼 .. 중첩 된 요청/응답 – Claysson

0

클라이언트가 서버의 "HTTP/1.1 100 continue"응답을 기다리는 중입니다. 이것이 작동하는 방식입니다. 서버에 데이터를 게시 할 때 서버가 데이터를 아직 받아 들일 준비가되지 않은 경우가 있습니다. 예를 들어, 먼저 클라이언트를 인증하려고합니다.

그래서 POST 요청을 보내면 클라이언트는 "Expect : 100-Continue"가 추가 된 요청 헤더를 보냅니다.

POST/URL의 HTTP/1.1 서버 : 서버 이름/FQDN 콘텐츠 길이 : 100 는 기대 :

을 100-계속 서버가이 응답 데이터를 수신 할 준비가되어있는 경우 :

HTTP/1.1 100 계속 서버 : 서버 이름/fqdn

이제 클라이언트에서 데이터를 보낼 수 있습니다.

그러나 서버가 데이터를 수신 할 준비가되지 않았고 클라이언트를 인증하려는 경우 다른 상태 코드로 응답합니다.

wireshark 추적을 pastebin.com에 게시하면 확인할 수 있지만 이것이 일어나는 것 같습니다.

피들러가 HttpListener를 사용하여 HTTP 요청을 청취하고 HTTP 수신기가 응용 프로그램 (이 경우 피들러)에서 100-continue와 같은 중간 응답을 숨기는 것일 수 있습니다.

+0

추적 내용이 확실하지 않습니다. WireShark에서 어떻게 얻을 수 있습니까? – Claysson

+0

이전처럼 "follow tcp stream"을 클릭하십시오. 그런 다음 텍스트 파일에 복사/붙여 넣기하고 내용을 pastebin에 넣습니다.com – feroze

+0

문제가 해결되었습니다. 문제가 서버에서 발견되어 어떤 종류의 문제인지 잘 모릅니다. feroze, 시간을내어 주셔서 감사합니다! – Claysson