如下程序是一个小应用中的一段。这个应用跑在服务器上,它的作用是从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;
        }

解决方案 »

  1.   

    http://weblogs.asp.net/jan/archive/2003/12/04/41154.aspxpublic class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
    {
    public TrustAllCertificatePolicy()
    { } public bool CheckValidationResult(ServicePoint sp,
     X509Certificate cert, WebRequest req, int problem)
    {
        return true;
    }
    }USE:
    System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
      

  2.   

    我看了那老外的blog, 试了上述方法,也试了.net 2.0的新方法:public static bool TrustAllCertificateCallback(object sender,
               X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
           {
               return true;
           }代码中开头加上这句   ServicePointManager.ServerCertificateValidationCallback = TrustAllCertificateCallback;但是都不能成功登陆Google。我的代码到底哪里不对呢?