如下程序是一个小应用中的一段。这个应用跑在服务器上,它的作用是从webserver获取用户想要的页面,然后加工处理后再返回给用户,用户的每个请求都会经过我这个中介的处理。现在我碰到的问题是如何维护cookie信息,我需要将webserver设置过来的cookie正确地转设到客户端,将用户请求中的cookie正确地转发到webserver端。如下程序已经有处理cookie的部分了,用户登录像codeproject这样在登录页面不使用https的网站没有问题,但是无法登陆如google这样使用https的网站。
请大家指教我代码中的问题,非常感谢。
private string GetPageHtml(string pageUrl)
{
string html; // request object
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(pageUrl); // pass all cookies from client to the page
if (!string.IsNullOrEmpty(Request.Headers["Cookie"]))
{
pageRequest.Headers[System.Net.HttpRequestHeader.Cookie] = Request.Headers["Cookie"];
} // pass postback data from client to the page
// post data should have format like: name1=value1&name2=value21&name2=value22
if (Request.HttpMethod == "POST" && Request.RawUrl.IndexOf('?') >= 0)
{
StringBuilder postDataBuilder = new StringBuilder();
bool first = true;
for (int i = 0; i < Request.Form.Count; ++i)
{
string name = Request.Form.GetKey(i);
string[] values = Request.Form.GetValues(i);
foreach (string value in values)
{
if (!first)
postDataBuilder.Append("&");
else
first = false; postDataBuilder.AppendFormat("{0}={1}", name, value);
}
}
string postData = postDataBuilder.ToString();
if (!string.IsNullOrEmpty(postData))
{
byte[] postDataByteArray = Encoding.ASCII.GetBytes(postData);
pageRequest.Method = "POST";
pageRequest.ContentType = "application/x-www-form-urlencoded";
pageRequest.ContentLength = postDataByteArray.Length;
Stream writeStream = pageRequest.GetRequestStream();
writeStream.Write(postDataByteArray, 0, postDataByteArray.Length);
writeStream.Close();
}
} // get response
HttpWebResponse pageResponse = (HttpWebResponse)pageRequest.GetResponse();
Stream responseStream = pageResponse.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, GetPageEncoding(pageUrl));
html = sr.ReadToEnd();
sr.Close(); // set all cookies from the page to client
if (!string.IsNullOrEmpty(pageResponse.Headers[System.Net.HttpResponseHeader.SetCookie]))
{
Response.AppendHeader("Set-Cookie", pageResponse.Headers[System.Net.HttpResponseHeader.SetCookie]);
} return html;
}
请大家指教我代码中的问题,非常感谢。
private string GetPageHtml(string pageUrl)
{
string html; // request object
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(pageUrl); // pass all cookies from client to the page
if (!string.IsNullOrEmpty(Request.Headers["Cookie"]))
{
pageRequest.Headers[System.Net.HttpRequestHeader.Cookie] = Request.Headers["Cookie"];
} // pass postback data from client to the page
// post data should have format like: name1=value1&name2=value21&name2=value22
if (Request.HttpMethod == "POST" && Request.RawUrl.IndexOf('?') >= 0)
{
StringBuilder postDataBuilder = new StringBuilder();
bool first = true;
for (int i = 0; i < Request.Form.Count; ++i)
{
string name = Request.Form.GetKey(i);
string[] values = Request.Form.GetValues(i);
foreach (string value in values)
{
if (!first)
postDataBuilder.Append("&");
else
first = false; postDataBuilder.AppendFormat("{0}={1}", name, value);
}
}
string postData = postDataBuilder.ToString();
if (!string.IsNullOrEmpty(postData))
{
byte[] postDataByteArray = Encoding.ASCII.GetBytes(postData);
pageRequest.Method = "POST";
pageRequest.ContentType = "application/x-www-form-urlencoded";
pageRequest.ContentLength = postDataByteArray.Length;
Stream writeStream = pageRequest.GetRequestStream();
writeStream.Write(postDataByteArray, 0, postDataByteArray.Length);
writeStream.Close();
}
} // get response
HttpWebResponse pageResponse = (HttpWebResponse)pageRequest.GetResponse();
Stream responseStream = pageResponse.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, GetPageEncoding(pageUrl));
html = sr.ReadToEnd();
sr.Close(); // set all cookies from the page to client
if (!string.IsNullOrEmpty(pageResponse.Headers[System.Net.HttpResponseHeader.SetCookie]))
{
Response.AppendHeader("Set-Cookie", pageResponse.Headers[System.Net.HttpResponseHeader.SetCookie]);
} return html;
}
{
public TrustAllCertificatePolicy()
{ } public bool CheckValidationResult(ServicePoint sp,
X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}USE:
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
{
return true;
}代码中开头加上这句 ServicePointManager.ServerCertificateValidationCallback = TrustAllCertificateCallback;但是都不能成功登陆Google。我的代码到底哪里不对呢?