2012-11-19 3 views
2

일부 웹 요청 및 게시 데이터를 수행하는 간단한 C# 프로그램을 작성하고 있습니다. 암호 및 html 형식의 항목으로 로그인하는 것과 같은 기본 작동 방식을 이해합니다. 그러나 나는 체크 박스와 텍스트 필드와 같은 입력 매개 변수 (예 :이 질문 페이지)가 많은지 궁금하다. 문자열에 20 개의 매개 변수를 하드 코딩하고 전달하는 것보다 효율적인 방법이 있습니까? html 파일을 읽고 구문을 분석하여 입력을 검사하고 문자열 작성기를 사용하여 문자열을 작성할 수 있지만 그렇게하는 것보다 효율적인 방법이 있습니까?C# HttpWebRequest Post 메서드 형태로 많은 매개 변수

private HtmlAgilityPack.HtmlDocument getpage(string url ,String input) 
    { 
     try 
     { 
      Stream datastream; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      request.CookieContainer = new CookieContainer(); 
      request.CookieContainer.Add(cookies); 
      request.AllowAutoRedirect = true; 
      request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
      request.ContentType = "application/x-www-form-urlencoded"; 

      if (input!=null) 
      { 
       String postData = ""; 
       request.Method = "POST"; 
       if (input == "login") 
       { 
        postData = String.Format("username={0}&password={1}", "myusername", "mypassword"); 
       } 
       else if (input == "sendMessage") 
       { 
       //THIS IS THE LONG STRING THAT I DON'T WANT TO HARD CODE 
        postData = String.Format("reciever={0}&sendmessage={1}", "thepersontomessage" ,this.DefaultMessage); 
       //I am just puting two parameters for now, there should be alot 
       } 
       byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
       request.ContentLength = byteArray.Length; 
       datastream = request.GetRequestStream(); 
       datastream.Write(byteArray, 0, byteArray.Length); 
       datastream.Close(); 
      } 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      datastream = response.GetResponseStream(); 
      String sourceCode = ""; 
      using (StreamReader reader = new StreamReader(datastream)) 
      { 
       sourceCode = reader.ReadToEnd(); 
      } 

      HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
      htmlDoc.LoadHtml(sourceCode); 
      this.cookies.Add(response.Cookies); 
      return htmlDoc; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
또한

내가 브라우저 (기본적으로 포스트 URL 문자열 및 전송 매개 변수 값) 내에서 HTML 형식의 버튼을 클릭하면 설정 매개 변수 값이 무엇인지 볼 수있는 간단한 방법이 그래서 내가 할 수있는

var parms = new Dictionary<string,string>(); 

parms.Add("username","fred"); 

그런 다음 방법은 수 있습니다 다음 Postdatastring에 해당 값 (체크 박스, 텍스트 등) 개인적으로 내가 어떻게 할 것인지

+0

가 브라 우어가 서버에 전송을 확인하려면을 (http://fiddler2.com) – Alex

답변

11

당신이 단지 수 있도록 Dictionary<string,string>과 같은 매개 변수를 구축입니다 하드 코드 예 :

string DictToString(Dictionary<string,string> dict) 
{ 
    StringBuilder builder = new StringBuilder(); 

    foreach(KeyValuePair<string,string> kvp in dict) { 
     builder.Append(kvp.Key + "=" + kvp.Value + "&"); 
    } 

    return builder.ToString(); 
} 
그런 다음에 최종 매개 변수 문자열 얻을 수

: [피들러]를 설치

var parms_str = builder.ToString(); 
+0

왜 익명 downvote ? – Lloyd

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 아무도 이유를 알지 못하는 이유는 모르겠지만 사전에 키와 값을 넣으려고합니다. 아직 HTML을 구문 분석하고 양식의 모든 입력을 가져와야합니다. 권리? 다른 쉬운 방법이 아닌가? – noobiehacker

+2

위에서 언급 한 것과 같은 사전을 사용하여 WebClient.UploadValues ​​()에 전달할 수 있습니다. 그게 당신을 위해 양식을 올바르게 서식 것입니다. 쿼리 문자열을 직접 작성하지 않아도됩니다. – feroze