2012-07-25 116 views
2

我新的編程(C#)和我開始寫的MMORPG學習與編程網站和東西通信的殭屍...登錄到使用網站的HttpWebRequest

我發現有關此主題的許多問題在這裏和那裏。最後一個伸出援助之手,我能找到的東西,並完成它,而不幸的是不工作:(

的mothods:

public static CookieCollection GetCookie(HttpWebRequest request) 
    { 

     if (request.CookieContainer == null) 
     { return new CookieContainer().GetCookies(request.RequestUri); } 
     else 
     { return request.CookieContainer.GetCookies(request.RequestUri); } 
    } 


    public static CookieContainer GetCookie(HttpWebResponse response) 
    { 

     CookieContainer cookiecontainer = new CookieContainer(); 
     cookiecontainer.Add(response.Cookies); 

     return cookiecontainer; 
    } 


    public static void SetCookie(HttpWebRequest request, CookieContainer cookie) 
    { 
     request.CookieContainer = cookie; 
    } 


    public static void SetCookie(HttpWebResponse response, CookieCollection cookie) 
    { 
     response.Cookies = cookie; 
    } 


    public static HttpWebResponse PostData(string uri,string request,CookieContainer cookie) 
    { 
     HttpWebRequest httprequest; 
     byte[] requestbytes; 
     Stream requeststream; 
     HttpWebResponse httpresponse; 

     httprequest = (HttpWebRequest)HttpWebRequest.Create(uri); 

     if (cookie == null) 
     {httprequest.CookieContainer=new CookieContainer();} 
     else 
     {httprequest.CookieContainer=cookie;} 

     httprequest.Method = "POST"; 
     httprequest.ContentType = "application/x-www-form-urlencoded"; 
     httprequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19"; 
     requestbytes = ASCIIEncoding.ASCII.GetBytes(request); 
     httprequest.ContentLength = requestbytes.Length; 

     requeststream=httprequest.GetRequestStream(); 
     requeststream.Write(requestbytes,0,requestbytes.Length); 
     requeststream.Close(); 

     httpresponse=(HttpWebResponse)httprequest.GetResponse(); 

     if (!(httpresponse.Cookies.Count>0)) 
     { SetCookie(httpresponse, GetCookie(httprequest)); } 

     return httpresponse; 
    } 


    public static HttpWebResponse GetData(string uri, CookieContainer cookie) 
    { 
     HttpWebRequest httprequest; 
     HttpWebResponse httpresponse; 

     httprequest = (HttpWebRequest)HttpWebRequest.Create(uri); 

     if (cookie == null) 
     { httprequest.CookieContainer = new CookieContainer(); } 
     else 
     { httprequest.CookieContainer = cookie; } 

     httprequest.Method = "GET"; 
     httprequest.ContentType = "application/x-www-form-urlencoded"; 
     httprequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19"; 

     httpresponse = (HttpWebResponse)httprequest.GetResponse(); 

     if (!(httpresponse.Cookies.Count > 0)) 
     { SetCookie(httpresponse, GetCookie(httprequest)); } 

     return httpresponse; 
    } 

主:

 string uri = "http://s2.kingsera.org"; 
     string userName = "someUserName"; 
     string passWord = "somePassWord"; 

     string postData = "signinUsername=" + userName + "&signinPassword=" + passWord + "&signinRemember=remember"; 
     CookieContainer cookie = new CookieContainer(); 

     HttpWebResponse response = PostData(uri, postData, cookie); 

     CookieContainer c = GetCookie(response); 

看來登錄頁面正在做的事情,使其更加複雜!http://s2.kingsera.org

每一個單一的評論/建議將不勝感激 謝謝提前。

+0

您尚未在[httpWebRequest.Credentials](http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.credentials.aspx)屬性中設置任何內容。 – Amicable 2012-07-25 13:46:57

+0

好吧,其實我有。但它看起來並不像我在這個課堂的例子中看到的那些。 – Musketeer 2012-07-25 16:38:42

回答

0

我不會在技術上回答你的問題,但是當我碰到類似的東西時,我會轉向Fiddler,它攔截你的計算機和遠程服務器之間的網絡流量。

這將允許您查看您的瀏覽器正在向遠程服務器發送的確切請求及其所有頭文件,cookie數據等,以及您的代碼對遠程服務器的請求。

這兩個請求之間的差異應該會告訴您解決問題的方法,或者至少爲您提供大量用於故障排除的額外信息。

+0

感謝提示,我想這有點像TamperData和Firebug,不是嗎? – Musketeer 2012-07-25 16:36:59

+0

@Musketeer非常喜歡 - 我不熟悉TamperData,但它與Firebug的網絡選項卡大致相同,但它可以處理所有HTTP流量,因此通過比較檢查請求是非常好的。甚至可能是您的目標網站正在檢查瀏覽器請求字符串或其他部分。如果你能欺騙自己的同一個請求,你一定會得到相同的迴應。 – glenatron 2012-07-25 21:10:07