繁体   English   中英

如何将此Web浏览器请求更改为HTTPWebRequest?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM