2009-03-30 5 views
-1

이것은 나를 괴롭히는 것이고 어디에서 공을 떨어 뜨리는 지 알 수 없습니다. 나는 googlemonsta를 통해 발견 된 몇 가지 예를 따랐다. 내가 어슬렁 거리는 곳으로 향하는 포인터는 크게 호소 될 것이다.C# (httpwebrequest)을 사용하여 외부 사이트에 POST 호출

 var writer = new StringWriter(); 
     param = "location=" + Server.UrlEncode(param); 
     byte[] paramStream = Encoding.ASCII.GetBytes(param + "&param2=value"); 
     var URL = "http://www.somesite.com"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2"; 
     request.ContentLength = paramStream.Length; 
     using(var stream = request.GetRequestStream()) 
     { 
      stream.Write(paramStream, 0, paramStream.Length); 
     } 

     var response = request.GetResponse(); 

     string result; 
     using (var sr = new StreamReader(response.GetResponseStream())) 
     { 
      result = sr.ReadToEnd(); 
     } 

고마워요!

EDIT : 지금까지 내가 사이트를 친다는 것을 알 수 있지만 (html로 돌아가고 있음) 매개 변수는 전달되지 않았습니다. 나는 그것이 성공했을 때 값이 나타날 곳을 기본적으로 얻고 있습니다. 나는 첫번째로 &를 삭제하려고 노력했다. 그러나 didnt는 아무 곳에도 얻지 않는다.

편집 : 수정 된 코드는 변경 사항을 반영합니다.

+0

어느 부분이 실패합니까? – JaredPar

+0

오류 메시지가 표시되거나 결과가 표시되지 않습니까? – Micah

+0

"근본적으로 가치가있는 곳을 얻는 것이 성공했으면"그게 무슨 뜻입니까? 값이 게시됩니까? 정확히 작동하지 않는 것은 무엇입니까? – BFree

답변

3

아마도 첫 번째 매개 변수의 시작 부분에서 &을 제거 할 수 있습니까? 그것보다 근본적으로 괜찮아 보입니다. 실제 코드에서 매개 변수 이름을 확인하십시오. 샘플에서 "매개 변수"가있는 곳은 거의 "매개 변수"여야합니다. 그러나 실제 코드가 어떻게 보이는지 또는 실제 사이트에서 기대하는 바를 모릅니다.

실제 일어나고있는 것에 대한 자세한 정보를 제공해주십시오. 우리는 그것이 작동하지 않는다는 것을 알고 있지만 가능한 많은 다른 실패 모드가 있습니다 :)

한 가지 더 생각해 봅시다 - 내용 길이를 지정하지 않았습니다. 이것이 자동으로 WebRequest으로 채워지는지 확실하지 않습니다. WireShark을 사용하여 발신 요청에 있는지 여부를 확인하는 것이 좋습니다.

그냥 연습의 일반적인 지점으로, 당신은 WebResponse 폐기해야하며, 이미 응답 스트림에 대한 using 문 가지고있는 경우에 당신은 Close를 호출 할 필요가 없습니다

string result; 
using (WebResponse response = request.GetResponse()) 
{ 
    using (var sr = new StreamReader(response.GetResponseStream())) 
    { 
     result = sr.ReadToEnd(); 
    } 
} 
+0

응답 해 주셔서 감사합니다. Jon, 빠른 질문 : 길이는 어떻게 되나요? paramStream + URL을 사용하면 b/c 오류가 발생합니다. paramStream 또는 URL을 사용하면 길이를 초과하여 실패합니다. 감사! – Chance

+0

Paramstream.Length가 올바른 크기 여야합니다. –

+0

예 - 내가 위치의 & infront을 제거했을 때 그것을 받아 들였습니다. 아직 아무 일도하지 않으므로 Wireshark가 2kbps로 다운로드 할 때까지 기다려야합니다 ... 도움의 손길에 감사드립니다. – Chance

1

이됩니다 당신은 반드시 그 게시물에 필요한 모든 가치를 가지고 있습니까? 난 한때 같은했다 형태의 숨겨진 입력 필드가 있었다 경우했다 :

<input name="action" type="hidden" id="action" value="login"> 

와 나는 같은 PARAM로 그 공급했다 : 당신은 확인

&action=login 

양식에서 무엇이든 놓치지 말고 내가 말하고있는 것이 있습니다 ...

EDIT : 한 가지 더 : 방금이 코드를 보았습니다.이 코드를 다시 보았습니다. there :

request.ContentLength = bytes.Length; 

필요한 경우 확실하지 않지만 길이를 설정하지 않은 것으로 나타났습니다.

+0

멋진 감사 - 아무 소용이 추가되었습니다. 후드 아래에서 무슨 일이 일어나고 있는지보기 위해 wireshark를 기다리십시오. – Chance

0

매개 변수가 끝난 후 캐리지 리턴/새 행만큼 단순하지는 않습니까? internets에 대한 HTTP 문서를 살펴보면 나중에 빈 줄이 필요할 것입니다.

(웹 서버에 수동으로 연결하고 요청을 붙여 넣으라고 제안합니다.)

관련 문제