2012-07-25 119 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