zoukankan      html  css  js  c++  java
  • .net cookie跨域和逗号bug的修复

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Text.RegularExpressions;
    using System.Collections;
    using System.Security.Cryptography.X509Certificates;
    using System.Net.Security;
    
    namespace BlowFish
    {
        public class Cookie
        {
            #region 属性
            public string Name { get; set; }
            public string Value { get; set; }
            public string Domain { get; set; }
            #endregion
    
            #region 方法
    
    
            #endregion
        }
        public class CookieContainer
        {
            private Hashtable _htcookie = new Hashtable();
            public void AddCookie(Cookie c)
            {
                if (c.Value.IndexOf(";") < 0 && c.Name.IndexOf(";") < 0)
                {
                    _htcookie.Remove(c.Name);
                    _htcookie.Add(c.Name, c);
                }
                else
                {
                    throw new Exception("cookiez值或名称不合规范");
                }
            }
            public Cookie GetCookie(string Name)
            {
                if (_htcookie.Contains(Name))
                {
                    return _htcookie[Name] as Cookie;
                }
                else
                {
                    return null;
                }
            }
            public void RemoveCookie(string Name)
            {
                _htcookie.Remove(Name);
            }
            public List<Cookie> GetCookies(string url)
            {
                List<Cookie> l = new List<Cookie>();
    
                string s = new Regex("https*://[^/]+").Match(url).Value.Replace("http://", "").Replace("https://", "").Replace("www.", "").Replace("/", "");
                if (s != "")
                {
                    foreach (DictionaryEntry de in _htcookie)
                    {
                        string demain = (de.Value as Cookie).Domain;
    
                        if (s.IndexOf(demain) > -1)
                        {
                            l.Add(de.Value as Cookie);
                        }
                    }
                }
                return l;
            }
    
        }
        public class HTTPRequest
        {
    
            public HTTPRequest(string Url)
            {
                _url = Url;
            }
            #region 字段
            private string _url = string.Empty;
            private int _timeout = 10000;
            private string _contenttype = "application/x-www-form-urlencoded";
            private string _useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
            private string _accept = "application/x-javascript";
            private bool _allowwritestreambuffering = false;
            private bool _expect100continue = false;
            #endregion
    
            #region 属性
            public string RequestUrl
            {
                get
                {
    
                    return _url;
                }
                set
                {
                    _url = value;
                }
            }
            public int Timeout
            {
                get
                {
                    return _timeout;
                }
                set
                {
                    _timeout = value;
                }
            }
            public string Refer { get; set; }
            public string ContentType
            {
                get
                {
                    return _contenttype;
                }
                set
                {
                    _contenttype = value;
                }
            }
            public string UserAgent
            {
                get
                {
                    return _useragent;
                }
                set
                {
                    _useragent = value;
                }
            }
            public string Accept
            {
                get
                {
                    return _accept;
                }
                set
                {
                    _accept = value;
                }
            }
            public bool AllowWriteStreamBuffering
            {
                get
                {
                    return _allowwritestreambuffering;
                }
                set
                {
                    _allowwritestreambuffering = value;
                }
            }
            public bool Expect100Continue
            {
                get
                {
                    return _expect100continue;
                }
                set
                {
                    _expect100continue = value;
                }
            }
            #endregion
    
            #region 公共方法
            public byte[] GetResponse(byte[] postData, ref CookieContainer cookies)
            {
                byte[] b = null;
                string myUrl = "-1";
                while (true)
                {
                    if (myUrl == null)
                    {
                        break;
                    }
                    else
                    {
                        if (myUrl == "-1")
                        {
                            b = _GetResponse(_url, Refer, "POST", postData, ref cookies, ref myUrl);
                        }
                        else
                        {
                            b = _GetResponse(myUrl, Refer, "GET", null, ref cookies, ref myUrl);
    
                            if (myUrl != null)
                            {
    
                                _url = myUrl;
                            }
                        }
                    }
                    if (b == null)
                    {
                        break;
                    }
                }
                return b;
            }
            public byte[] GetResponse(ref CookieContainer cookies)
            {
    
                byte[] b = null;
                string myUrl = "-1";
                while (true)
                {
                    if (myUrl == null)
                    {
                        break;
                    }
                    else
                    {
                        if (myUrl == "-1")
                        {
                            b = _GetResponse(_url, Refer, "GET", null, ref cookies, ref myUrl);
                        }
                        else
                        {
    
                            b = _GetResponse(myUrl, Refer, "GET", null, ref cookies, ref myUrl);
                            if (myUrl != null)
                            {
    
                                _url = myUrl;
                            }
                        }
                    }
                    if (b == null)
                    {
                        break;
                    }
                }
                return b;
            }
            #endregion
    
            #region 私有方法
            private byte[] _GetResponse(string _u, string refer, string _m, byte[] postData, ref CookieContainer _cookies, ref string Location)
            {
                if (_u.IndexOf("https") > -1)
                {
                    try
                    {
                        string strHtmlContent = string.Empty;
                        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckVolidationResult);
                        HttpWebRequest webRequest = WebRequest.Create(_u) as HttpWebRequest;
                        webRequest.ProtocolVersion = HttpVersion.Version11;
                        webRequest.Timeout = Timeout;
                        webRequest.ContentType = _contenttype;
                        webRequest.Referer = refer;
                        webRequest.UserAgent = _useragent;
                        webRequest.AllowAutoRedirect = false;
                        webRequest.Method = _m;
                        webRequest.Accept = _accept;
                        webRequest.AllowWriteStreamBuffering = _allowwritestreambuffering;
                        webRequest.ServicePoint.Expect100Continue = _expect100continue;
                        //添加cookie
                        string strcookie = string.Empty;
                        if (_cookies != null)
                        {
                            foreach (Cookie c in _cookies.GetCookies(_u))
                            {
                                strcookie += c.Name + "=" + c.Value + ";";
                            }
                            webRequest.Headers.Set("cookie", strcookie);
                        }
                        if (_m.ToLower() == "post")
                        {
                            webRequest.ContentLength = postData.Length;
                            Stream requestStream = webRequest.GetRequestStream();
                            requestStream.Write(postData, 0, postData.Length);
                            requestStream.Close();
                        }
                        HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();//获得服务器响应对象 
    
                        //处理返回cookie
                        if (_cookies != null)
                        {
                            if (response != null)
                            {
                                string s = response.Headers["Set-Cookie"];
                                if (!string.IsNullOrEmpty(s))
                                {
                                    while (true)
                                    {
                                        string mytemp = new Regex("[^,;]+=").Match(s).Value;
                                        if (!string.IsNullOrEmpty(mytemp))
                                        {
                                            string myIs = new Regex("([Ee][Xx][Pp][Ii][Rr][Ee][Ss])|([Dd][Oo][Mm][Aa][Ii][Nn])|([Pp][Aa][Tt][Hh])").Match(mytemp).Value;
                                            if (string.IsNullOrEmpty(myIs))
                                            {
                                                s = s.Substring(s.IndexOf(mytemp));
                                                string mysp = s.Split(';')[0];
                                                string myd = new Regex("[Dd][Oo][Mm][Aa][Ii][Nn]=[a-zA-Z0-9_%$#@!.*-]+").Match(s).Value;
    
                                                Cookie c = new Cookie();
                                                c.Name = mysp.Split('=')[0];
                                                c.Value = mysp.Split('=')[1];
                                                c.Domain = myd.Substring(myd.IndexOf('=') + 1); ;
                                                _cookies.AddCookie(c);
                                                s = s.Substring(s.IndexOf(mysp) + mysp.Length);
                                            }
                                            else
                                            {
    
                                                s = s.Substring(s.IndexOf(mytemp) + mytemp.Length);
                                            }
                                        }
                                        else
                                        {
    
                                            break;
                                        }
                                    }
                                }
    
                            }
                        }
    
                        Location = response.Headers["Location"];
                        Stream resStream = response.GetResponseStream();//转成流对象  
                        MemoryStream memoryStream = new MemoryStream();
                        const int bufferLength = 1024;
                        int actual; byte[]
                            buffer = new byte[bufferLength];
                        while ((actual = resStream.Read(buffer, 0, bufferLength)) > 0)
                        {
                            memoryStream.Write(buffer, 0, actual);
                        }
    
                        // 设置当前流的位置为流的开始 
                        //resStream.Seek(0, SeekOrigin.Begin);
                        //MemoryStream ms=new MemoryStream(
                        response.Close();
                        webRequest.Abort();
                        return memoryStream.ToArray();
                    }
                    catch (Exception ex)
                    {
                        //throw ex; 
                        string slog = "执行请求操作失败,错误信息:" + ex.Message;
                        if (slog.IndexOf("404", 0) < -1)
                            iFIASSoft.Manager.WriteLog(slog);
                        return null;
                    }
                }
                else
                {
                    try
                    {
                        string strHtmlContent = string.Empty;
                        HttpWebRequest webRequest = WebRequest.Create(_u) as HttpWebRequest;
                        webRequest.Timeout = Timeout;
                        webRequest.ContentType = _contenttype;
                        webRequest.Referer = refer;
                        webRequest.UserAgent = _useragent;
                        webRequest.AllowAutoRedirect = false;
                        webRequest.Method = _m;
                        webRequest.Accept = _accept;
                        webRequest.AllowWriteStreamBuffering = _allowwritestreambuffering;
                        webRequest.ServicePoint.Expect100Continue = _expect100continue;
                        //添加cookie
                        string strcookie = string.Empty;
                        if (_cookies != null)
                        {
                            foreach (Cookie c in _cookies.GetCookies(_u))
                            {
                                strcookie += c.Name + "=" + c.Value + ";";
                            }
                            webRequest.Headers.Set("cookie", strcookie);
                        }
                        if (_m.ToLower() == "post")
                        {
                            webRequest.ContentLength = postData.Length;
                            Stream requestStream = webRequest.GetRequestStream();
                            requestStream.Write(postData, 0, postData.Length);
                            requestStream.Close();
                        }
                        HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();//获得服务器响应对象 
    
                        //处理返回cookie
                        if (_cookies != null)
                        {
                            if (response != null)
                            {
                                string s = response.Headers["Set-Cookie"];
                                if (!string.IsNullOrEmpty(s))
                                {
                                    while (true)
                                    {
                                        string mytemp = new Regex("[^,;]+=").Match(s).Value;
                                        if (!string.IsNullOrEmpty(mytemp))
                                        {
                                            string myIs = new Regex("([Ee][Xx][Pp][Ii][Rr][Ee][Ss])|([Dd][Oo][Mm][Aa][Ii][Nn])|([Pp][Aa][Tt][Hh])").Match(mytemp).Value;
                                            if (string.IsNullOrEmpty(myIs))
                                            {
                                                s = s.Substring(s.IndexOf(mytemp));
                                                string mysp = s.Split(';')[0];
                                                string myd = new Regex("[Dd][Oo][Mm][Aa][Ii][Nn]=[a-zA-Z0-9_%$#@!.*-]+").Match(s).Value;
    
                                                Cookie c = new Cookie();
                                                c.Name = mysp.Split('=')[0];
                                                c.Value = mysp.Split('=')[1];
                                                c.Domain = myd.Substring(myd.IndexOf('=') + 1); ;
                                                _cookies.AddCookie(c);
                                                s = s.Substring(s.IndexOf(mysp) + mysp.Length);
                                            }
                                            else
                                            {
    
                                                s = s.Substring(s.IndexOf(mytemp) + mytemp.Length);
                                            }
                                        }
                                        else
                                        {
    
                                            break;
                                        }
                                    }
                                }
    
                            }
                        }
                        Location = response.Headers["Location"];
                        Stream resStream = response.GetResponseStream();//转成流对象  
                        //StreamReader sr = new StreamReader(resStream, Encoding.UTF8);
                        //strHtmlContent = sr.ReadToEnd();
                        MemoryStream memoryStream = new MemoryStream();
                        const int bufferLength = 1024;
                        int actual; byte[]
                            buffer = new byte[bufferLength];
                        while ((actual = resStream.Read(buffer, 0, bufferLength)) > 0)
                        {
                            memoryStream.Write(buffer, 0, actual);
                        }
    
                        // 设置当前流的位置为流的开始 
                        //resStream.Seek(0, SeekOrigin.Begin);
                        //MemoryStream ms=new MemoryStream(
                        response.Close();
                        webRequest.Abort();
                        return memoryStream.ToArray();
                    }
                    catch (Exception ex)
                    {
                        // throw ex;
                        string slog = "执行请求操作失败,错误信息:" + ex.Message;
                        if (slog.IndexOf("404", 0) < -1)
                            iFIASSoft.Manager.WriteLog(slog);
                        return null;
                    }
                }
            }
            private bool CheckVolidationResult(object o, X509Certificate cetificate, X509Chain chain, SslPolicyErrors err)
            {
                return true;
            }
            #endregion
        }
    }

    ////////////////////////上面为子封装的类 下面用法事例

    public BlowFish.CookieContainer cookies = new BlowFish.CookieContainer();
    
    tring strHtmlContent = "";
    
    BlowFish.HTTPRequest wep = new BlowFish.HTTPRequest("网址");wep.Refer = "网址";
    byte[] b = wep.GetResponse(ref cookies);
    strHtmlContent = System.Text.Encoding.UTF8.GetString(b)
  • 相关阅读:
    揭秘!如何快速提高网站权重-关键词百度指数叠加
    dede编辑文章不更新时间的方法
    PHPCMS V9轻松完成WAP手机网站搭建全教程
    如何建立关键词词库
    3gcms-Flash幻灯片上传后图片模糊解决办法
    手机端wap站网页播放腾讯视频代码
    解决dede编辑器不能保存word文档样式问题
    vi查找替换命令详解 (转载)
    eclipse上安装 windowBuilder方法
    单播、多播(组播)和广播的区别
  • 原文地址:https://www.cnblogs.com/blowfish/p/2980130.html
Copyright © 2011-2022 走看看