2014-02-15 1 views
4

데이터를 웹 사이트에 게시하고 싶습니다. 이 코드와 함께 쿠키를 처리 :쿠키 및 viewState를 사용하여 웹 사이트에 데이터 게시

var doc = new HtmlAgilityPack.HtmlDocument(); 
       doc.Load(resp.GetResponseStream()); 
       foreach (HtmlNode input in doc.DocumentNode.SelectNodes("//input")) 
       {     
       if (input.Attributes["value"] != null) 
        { 
        val = input.Attributes["value"].Value; 
        if (val.IndexOf("1")!=-1) 
         { 
         viewState = val; 
         } 
        } 
       } 

그리고 마지막으로이 코드와 데이터를 게시하도록하겠습니다 :

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
         cookies = response.Cookies; 
         response.Close(); 
         string getUrl = "url"; 
         string postData = String.Format(""+viewstate); 
         HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); 
         getRequest.CookieContainer = new CookieContainer(); 
         getRequest.CookieContainer.Add(cookies); 

내 주요

CookieCollection cookies = new CookieCollection(); 
     request.CookieContainer = new CookieContainer(); 
       request.CookieContainer.Add(cookies);  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

이 코드로 viewstate가 값을 처리 문제는 viewState입니다. viewstate를 게시하지 않으면 동일한 페이지를 반환하거나 게시 데이터 이전에 viewstate 값을 구문 분석하고 데이터를 게시하면 세션이 시간 초과됩니다. 예를 들어 페이스 북에 로그인 할 수 있지만 viewState를 사용하는 웹 사이트에 데이터를 게시 할 수 없습니다. 나는이 상황을 알 수 없었다. 나는 같은 요청에서 viewstate를 게시물과 함께 구문 분석해야한다고 생각하지만 Webrequest를 재사용 할 수 없다는 것을 알고있다. 나 좀 도와 줄 수있어?

+0

링크를 통해 공유하고 싶은 것을 공유 할 수 있습니까? – Yozer

+0

apps.db.ripe.net/syncupdates/simple-rpsl.html – user3297904

답변

3

저는 CsQuery 라이브러리를 사용하고 있습니다. 유용하고 사용하기 쉽습니다. 그런 https://www.nuget.org/packages/CsQuery

사용하는 일부 클래스 : 포스트 매개 변수 당신이 원하는대로

public class WebClientEx : WebClient 
{ 
    public CookieContainer _cookies = new CookieContainer(); 

    public string Get(string URL) 
    { 
     return this.DownloadString(URL); 
    } 

    public WebClientEx() 
    { 
     this.Encoding = Encoding.UTF8; 
     System.Net.ServicePointManager.Expect100Continue = false; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 

     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.Host = "apps.db.ripe.net"; 
     request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0"; 
     request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     request.KeepAlive = true; 
     request.Proxy = new WebProxy(); 
     request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     request.CookieContainer = _cookies; 
     request.Headers.Add("Accept-Language", "en-us;q=0.7,en;q=0.3"); 
     request.ContentType = "application/x-www-form-urlencoded"; 

     return request; 
    } 

    public string Post(string URL, NameValueCollection data) 
    { 
     return this.Encoding.GetString(this.UploadValues(URL, data)); 
    } 
} 

설정. 다음을 수행하십시오.

 WebClientEx client = new WebClientEx(); 
     string Page = client.Get("https://apps.db.ripe.net/syncupdates/simple-rpsl.html"); //get some cookies and viewstate 

     CQ dom = CQ.Create(Page); 
     string viewstate = dom["input#javax\\.faces\\.ViewState"].Val(); //get viewstate 

     NameValueCollection data = new NameValueCollection(); 
     data.Add("rpslBox:postRpsl", "rpslBox:postRpsl"); 
     data.Add("rpslBox:postRpsl:sourceRadioSelect", "RIPE_NCC"); 
     data.Add("rpslBox:postRpsl:rpslObject", "your some string"); //your string 
     data.Add("rpslBox:postRpsl:update", "Update"); 
     data.Add("javax.faces.ViewState", viewstate); 

     Page = client.Post("https://apps.db.ripe.net/syncupdates/simple-rpsl.html", data); 
+0

오류가 발생했습니다. 형식 또는 네임 스페이스 NameValueCollection을 찾을 수 없습니다. 이유가 무엇입니까? – user3297904

+0

다음을 사용하여 적절하게 추가 : System.Collections.Specialized – Yozer

+0

덕분에 효과가있었습니다. 나는 한 가지 더 질문이있다. 나는 그것이 어떻게 작동하는지 이해하지 않는다. 하나의 연결에서 여러 요청을합니까? – user3297904

관련 문제