本文演示如何针对2种情况进行用户授权访问WEB,第1种是网站访问授权,第2种是网页内用户登录授权。
public class WebRequestWithUserLogin
{
public static string Test(string url, Encoding encoding, string loginUser, string loginPSW)
{
HttpWebResponse response = DoWebRequst(url, encoding, loginUser, loginPSW);
Stream stream = response.GetResponseStream(); //获取响应的字符串流
StreamReader sr = new StreamReader(stream); //创建一个stream读取流
string html = sr.ReadToEnd(); //从头读到尾,放到字符串html
return html;
}
private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36";
/// <summary>
/// ssl证书验证回调
/// </summary>
/// <param name="sender"></param>
/// <param name="certificate">证书</param>
/// <param name="chain">证书链</param>
/// <param name="errors">ssl错误信息</param>
/// <returns></returns>
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors)
{
return true; //总是接受
}
/// <summary>
/// 对指定网址发送访问请求
/// </summary>
/// <param name="url">网址</param>
/// <param name="encoding">编码类型</param>
/// <param name="loginUser">访问用户(部分网址要求先验证身份才能访问)</param>
/// <param name="loginPSW">访问密码(如果有)</param>
/// <returns></returns>
public static HttpWebResponse DoWebRequst(string url, Encoding encoding, string loginUser = "", string loginPSW = "")
{
HttpWebRequest request = null;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version11;
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = DefaultUserAgent;
if (loginUser.Length > 0 && loginPSW.Length > 0)
request.Credentials = new NetworkCredential(loginUser, loginPSW);
else
request.Credentials = CredentialCache.DefaultCredentials;
request.KeepAlive = true;
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.9";
HttpWebResponse httpWebResponse = (HttpWebResponse)request.GetResponse();
return httpWebResponse;
}
/// <summary>
/// 模拟用户登录(操作网页元素)
/// 参考博文:https://blog.csdn.net/qq_34202873/article/details/103823953
/// </summary>
public static System.Windows.Forms.WebBrowser Login()
{
System.Windows.Forms.WebBrowser webBrowser = new System.Windows.Forms.WebBrowser();
webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;
webBrowser.Navigate("http://10.120.131.194/login.html?/joblog_save.html");
return webBrowser;
}
private static void WebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.ToString() == "http://10.120.131.194/login.html?/joblog_save.html")//建议加此判断,不然容易出错。因为所有页面加载都会调用此方法,在你登录成功后也会执行本方法内的代码。
{
System.Windows.Forms.WebBrowser webBrowser = sender as System.Windows.Forms.WebBrowser;
System.Windows.Forms.HtmlElement element = webBrowser.Document.GetElementById("element10003");//查找用户名及密码输入框
if (element != null)
element.SetAttribute("value", "admin");//设置用户名或密码的数值
System.Windows.Forms.HtmlElementCollection htmlElementCollection = webBrowser.Document.GetElementsByTagName("input");
foreach (System.Windows.Forms.HtmlElement htmlElement in htmlElementCollection)
{
if (htmlElement.Name == "loginbtn")//查找登录按键并点击提交
htmlElement.InvokeMember("Click");
}
}
}
}