[英]How can I change this webbrowser request to a HTTPWebRequest?
我在將其轉換為HTTPWebRequest時遇到麻煩。 我使用WebBrowser使它完美工作,但是每當我嘗試創建HTTPWebRequest時,它都會失敗。 我不確定自己在做什么錯。
工作代碼:
private void Login()
{
WebBrowser b = new WebBrowser();
b.ScriptErrorsSuppressed = true;
username = textBox1.Text;
password = textBox2.Text;
string PostData = string.Format("username={0}&password={1}&rk24={2}", username, password, rk24);
ASCIIEncoding enc = new ASCIIEncoding();
b.Navigate(url, "", enc.GetBytes(PostData), "Content-Type: application/x-www-form-urlencoded\r\n");
b.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
}
private void b_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser b = sender as WebBrowser;
string response = b.DocumentText;
if (response.Contains("Sign out"))
{
this.Text = "LOGGED IN";
b.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
}
if (response.Contains("your info was incorrect"))
{
b.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
this.Text = "LOGIN ERROR";
MessageBox.Show("Invalid username or password!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
這是我嘗試的HTTPWebRequest不起作用...
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding enc = new ASCIIEncoding();
string postData = string.Format("username={0}&password={1}&rk24={2}", user, pass, rk24);
byte[] data = enc.GetBytes(postData);
request.ContentLength = data.Length;
Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
WebResponse response = request.GetResponse();
stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string responseFromServer = reader.ReadToEnd();
if(responseFromServer.Contains("Sign out"))
{
MessageBox.Show("Logged In!");
}
if (responseFromServer.Contains("your info was incorrect"))
{
MessageBox.Show("Invalid username or password");
}
登錄系統大多使用cookie和會話來提供身份驗證。 Web請求當然不會設置cookie等。這是瀏覽器的任務。 這很可能是Web瀏覽器版本在處理JS並保存cookie以及所有內容時起作用的原因。 您可以保存cookie。 看一下CookieContainer類。
對於這些情況,我想擴展WebClient類。 這是內部使用webrequests等的更抽象的版本。
也許這個片段會有所幫助:(也許打印cookie?如果這是問題,您一定要用瀏覽器檢查一下)
class MyWebClient : WebClient
{
Uri _responseUri;
public CookieContainer CookieContainer;
public Uri ResponseUri
{
get { return _responseUri; }
}
public MyWebClient()
{
CookieContainer = new CookieContainer(); //TODO improve with read/write actions from disk. (binaryformatter)
}
public string GetCookieValue(string name)
{
return CookieContainer.GetCookies(_responseUri).Cast<Cookie>().First(c => c.Name == name).Value;
}
protected override WebRequest GetWebRequest(Uri address)
{
var request = base.GetWebRequest(address);
var webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = CookieContainer;
}
return request;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
_responseUri = response?.ResponseUri;
return response;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.