简单记录CookieCollection的使用

HttpHelper

点击查看代码

/// <summary>
/// &#x7C7B;&#x8BF4;&#x660E;&#xFF1A;HttpHelper&#x7C7B;&#xFF0C;&#x7528;&#x6765;&#x5B9E;&#x73B0;Http&#x8BBF;&#x95EE;&#xFF0C;Post&#x6216;&#x8005;Get&#x65B9;&#x5F0F;&#x7684;&#xFF0C;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#xFF0C;&#x5E26;Cookie&#x7684;&#xFF0C;&#x5E26;&#x8BC1;&#x4E66;&#x7684;&#x7B49;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4EE3;&#x7406;
/// &#x91CD;&#x8981;&#x63D0;&#x793A;&#xFF1A;&#x8BF7;&#x4E0D;&#x8981;&#x81EA;&#x884C;&#x4FEE;&#x6539;&#x672C;&#x7C7B;&#xFF0C;&#x5982;&#x679C;&#x56E0;&#x4E3A;&#x4F60;&#x81EA;&#x5DF1;&#x4FEE;&#x6539;&#x540E;&#x5C06;&#x65E0;&#x6CD5;&#x5347;&#x7EA7;&#x5230;&#x65B0;&#x7248;&#x672C;&#x3002;&#x5982;&#x679C;&#x786E;&#x5B9E;&#x6709;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#x8BF7;&#x5230;&#x5B98;&#x65B9;&#x7F51;&#x7AD9;&#x63D0;&#x5EFA;&#x8BAE;&#xFF0C;
/// &#x6211;&#x4EEC;&#x4E00;&#x5B9A;&#x4F1A;&#x53CA;&#x65F6;&#x4FEE;&#x6539;
/// &#x7F16;&#x7801;&#x65E5;&#x671F;&#xFF1A;2011-09-20
/// &#x7F16; &#x7801; &#x4EBA;&#xFF1A;&#x82CF;&#x98DE;
/// &#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#xFF1A;361983679
/// &#x5B98;&#x65B9;&#x7F51;&#x5740;&#xFF1A;http://www.sufeinet.com/thread-3-1-1.html
/// &#x4FEE;&#x6539;&#x65E5;&#x671F;&#xFF1A;2017-09-30
/// &#x7248; &#x672C; &#x53F7;&#xFF1A;1.9
/// </summary>
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.IO.Compression;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Linq;
using System.Net.Cache;

namespace XXX.Common
{
    /// <summary>
    /// Http&#x8FDE;&#x63A5;&#x64CD;&#x4F5C;&#x5E2E;&#x52A9;&#x7C7B;
    /// </summary>
    public class HttpHelper
    {
        #region &#x9884;&#x5B9A;&#x4E49;&#x65B9;&#x53D8;&#x91CF;
        //&#x9ED8;&#x8BA4;&#x7684;&#x7F16;&#x7801;
        private Encoding encoding = Encoding.Default;
        //Post&#x6570;&#x636E;&#x7F16;&#x7801;
        private Encoding postencoding = Encoding.Default;
        //HttpWebRequest&#x5BF9;&#x8C61;&#x7528;&#x6765;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;
        private HttpWebRequest request = null;
        //&#x83B7;&#x53D6;&#x5F71;&#x54CD;&#x6D41;&#x7684;&#x6570;&#x636E;&#x5BF9;&#x8C61;
        private HttpWebResponse response = null;
        //&#x8BBE;&#x7F6E;&#x672C;&#x5730;&#x7684;&#x51FA;&#x53E3;ip&#x548C;&#x7AEF;&#x53E3;
        private IPEndPoint _IPEndPoint = null;
        #endregion

        #region Public

        /// <summary>
        /// &#x6839;&#x636E;&#x76F8;&#x4F20;&#x5165;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5F97;&#x5230;&#x76F8;&#x5E94;&#x9875;&#x9762;&#x6570;&#x636E;
        /// </summary>
        /// <param name="item">&#x53C2;&#x6570;&#x7C7B;&#x5BF9;&#x8C61;
        /// <returns>&#x8FD4;&#x56DE;HttpResult&#x7C7B;&#x578B;</returns>
        public HttpResult GetHtml(HttpItem item)
        {
            //&#x8FD4;&#x56DE;&#x53C2;&#x6570;
            HttpResult result = new HttpResult();
            try
            {
                //&#x51C6;&#x5907;&#x53C2;&#x6570;
                SetRequest(item);
            }
            catch (Exception ex)
            {
                //&#x914D;&#x7F6E;&#x53C2;&#x6570;&#x65F6;&#x51FA;&#x9519;
                return new HttpResult() { Cookie = string.Empty, Header = null, Html = ex.Message, StatusDescription = "&#x914D;&#x7F6E;&#x53C2;&#x6570;&#x65F6;&#x51FA;&#x9519;&#xFF1A;" + ex.Message };
            }
            try
            {
                //&#x8BF7;&#x6C42;&#x6570;&#x636E;
                using (response = (HttpWebResponse)request.GetResponse())
                {
                    GetData(item, result);
                }
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    using (response = (HttpWebResponse)ex.Response)
                    {
                        GetData(item, result);
                    }
                }
                else
                {
                    result.Html = ex.Message;
                }
            }
            catch (Exception ex)
            {
                result.Html = ex.Message;
            }
            if (item.IsToLower) result.Html = result.Html.ToLower();
            //&#x91CD;&#x7F6E;request&#xFF0C;response&#x4E3A;&#x7A7A;
            if (item.IsReset)
            {
                request = null;
                response = null;
            }
            return result;
        }
        #endregion

        #region GetData

        /// <summary>
        /// &#x83B7;&#x53D6;&#x6570;&#x636E;&#x7684;&#x5E76;&#x89E3;&#x6790;&#x7684;&#x65B9;&#x6CD5;
        /// </summary>
        /// <param name="item">
        /// <param name="result">
        private void GetData(HttpItem item, HttpResult result)
        {
            if (response == null)
            {
                return;
            }
            #region base
            //&#x83B7;&#x53D6;StatusCode
            result.StatusCode = response.StatusCode;
            //&#x83B7;&#x53D6;StatusDescription
            result.StatusDescription = response.StatusDescription;
            //&#x83B7;&#x53D6;Headers
            result.Header = response.Headers;
            //&#x83B7;&#x53D6;&#x6700;&#x540E;&#x8BBF;&#x95EE;&#x7684;URl
            result.ResponseUri = response.ResponseUri.ToString();
            //&#x83B7;&#x53D6;CookieCollection
            if (response.Cookies != null) result.CookieCollection = response.Cookies;
            //&#x83B7;&#x53D6;set-cookie
            if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"];
            #endregion

            #region byte

            //&#x5904;&#x7406;&#x7F51;&#x9875;Byte
            byte[] ResponseByte = GetByte();

            #endregion

            #region Html
            if (ResponseByte != null && ResponseByte.Length > 0)
            {
                //&#x8BBE;&#x7F6E;&#x7F16;&#x7801;
                SetEncoding(item, result, ResponseByte);
                //&#x5F97;&#x5230;&#x8FD4;&#x56DE;&#x7684;HTML
                result.Html = encoding.GetString(ResponseByte);
            }
            else
            {
                //&#x6CA1;&#x6709;&#x8FD4;&#x56DE;&#x4EFB;&#x4F55;Html&#x4EE3;&#x7801;
                result.Html = string.Empty;
            }
            #endregion
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x7F16;&#x7801;
        /// </summary>
        /// <param name="item">HttpItem
        /// <param name="result">HttpResult
        /// <param name="ResponseByte">byte[]
        private void SetEncoding(HttpItem item, HttpResult result, byte[] ResponseByte)
        {
            //&#x662F;&#x5426;&#x8FD4;&#x56DE;Byte&#x7C7B;&#x578B;&#x6570;&#x636E;
            if (item.ResultType == ResultType.Byte) result.ResultByte = ResponseByte;
            //&#x4ECE;&#x8FD9;&#x91CC;&#x5F00;&#x59CB;&#x6211;&#x4EEC;&#x8981;&#x65E0;&#x89C6;&#x7F16;&#x7801;&#x4E86;
            if (encoding == null)
            {
                Match meta = Regex.Match(Encoding.Default.GetString(ResponseByte), "<meta[^<]*charset=([^<]*)[\"']", regexoptions.ignorecase); string c="string.Empty;" if (meta !="null" && meta.groups.count> 0)
                {
                    c = meta.Groups[1].Value.ToLower().Trim();
                }
                if (c.Length > 2)
                {
                    try
                    {
                        encoding = Encoding.GetEncoding(c.Replace("\"", string.Empty).Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk").Trim());
                    }
                    catch
                    {
                        if (string.IsNullOrEmpty(response.CharacterSet))
                        {
                            encoding = Encoding.UTF8;
                        }
                        else
                        {
                            encoding = Encoding.GetEncoding(response.CharacterSet);
                        }
                    }
                }
                else
                {
                    if (string.IsNullOrEmpty(response.CharacterSet))
                    {
                        encoding = Encoding.UTF8;
                    }
                    else
                    {
                        encoding = Encoding.GetEncoding(response.CharacterSet);
                    }
                }
            }
        }
        /// <summary>
        /// &#x63D0;&#x53D6;&#x7F51;&#x9875;Byte
        /// </summary>
        /// <returns></returns>
        private byte[] GetByte()
        {
            byte[] ResponseByte = null;
            using (MemoryStream _stream = new MemoryStream())
            {
                //GZIIP&#x5904;&#x7406;
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                {
                    //&#x5F00;&#x59CB;&#x8BFB;&#x53D6;&#x6D41;&#x5E76;&#x8BBE;&#x7F6E;&#x7F16;&#x7801;&#x65B9;&#x5F0F;
                    new GZipStream(response.GetResponseStream(), CompressionMode.Decompress).CopyTo(_stream, 10240);
                }
                else
                {
                    //&#x5F00;&#x59CB;&#x8BFB;&#x53D6;&#x6D41;&#x5E76;&#x8BBE;&#x7F6E;&#x7F16;&#x7801;&#x65B9;&#x5F0F;
                    response.GetResponseStream().CopyTo(_stream, 10240);
                }
                //&#x83B7;&#x53D6;Byte
                ResponseByte = _stream.ToArray();
            }
            return ResponseByte;
        }

        #endregion

        #region SetRequest

        /// <summary>
        /// &#x4E3A;&#x8BF7;&#x6C42;&#x51C6;&#x5907;&#x53C2;&#x6570;
        /// </summary>
        ///<param name="item">&#x53C2;&#x6570;&#x5217;&#x8868;
        private void SetRequest(HttpItem item)
        {

            // &#x9A8C;&#x8BC1;&#x8BC1;&#x4E66;
            SetCer(item);
            if (item.IPEndPoint != null)
            {
                _IPEndPoint = item.IPEndPoint;
                //&#x8BBE;&#x7F6E;&#x672C;&#x5730;&#x7684;&#x51FA;&#x53E3;ip&#x548C;&#x7AEF;&#x53E3;
                request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);
            }
            //&#x8BBE;&#x7F6E;Header&#x53C2;&#x6570;
            if (item.Header != null && item.Header.Count > 0)
            {
                foreach (string key in item.Header.AllKeys)
                {
                    if (!request.Headers.AllKeys.Contains(key))
                        request.Headers.Add(key, item.Header[key]);
                }
            }
            // &#x8BBE;&#x7F6E;&#x4EE3;&#x7406;
            SetProxy(item);
            if (item.ProtocolVersion != null) request.ProtocolVersion = item.ProtocolVersion;
            request.ServicePoint.Expect100Continue = item.Expect100Continue;
            //&#x8BF7;&#x6C42;&#x65B9;&#x5F0F;Get&#x6216;&#x8005;Post
            request.Method = item.Method;
            request.Timeout = item.Timeout;
            request.KeepAlive = item.KeepAlive;
            request.ReadWriteTimeout = item.ReadWriteTimeout;
            if (!string.IsNullOrWhiteSpace(item.Host))
            {
                request.Host = item.Host;
            }
            if (item.IfModifiedSince != null) request.IfModifiedSince = Convert.ToDateTime(item.IfModifiedSince);
            //Accept
            request.Accept = item.Accept;
            //ContentType&#x8FD4;&#x56DE;&#x7C7B;&#x578B;
            request.ContentType = item.ContentType;
            //UserAgent&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8BBF;&#x95EE;&#x7C7B;&#x578B;&#xFF0C;&#x5305;&#x62EC;&#x6D4F;&#x89C8;&#x5668;&#x7248;&#x672C;&#x548C;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4FE1;&#x606F;
            request.UserAgent = item.UserAgent;
            // &#x7F16;&#x7801;
            encoding = item.Encoding;
            //&#x8BBE;&#x7F6E;&#x5B89;&#x5168;&#x51ED;&#x8BC1;
            request.Credentials = item.ICredentials;
            //&#x8BBE;&#x7F6E;Cookie
            SetCookie(item);
            //&#x6765;&#x6E90;&#x5730;&#x5740;
            request.Referer = item.Referer;
            //&#x662F;&#x5426;&#x6267;&#x884C;&#x8DF3;&#x8F6C;&#x529F;&#x80FD;
            request.AllowAutoRedirect = item.Allowautoredirect;
            if (item.MaximumAutomaticRedirections > 0)
            {
                request.MaximumAutomaticRedirections = item.MaximumAutomaticRedirections;
            }
            //&#x8BBE;&#x7F6E;Post&#x6570;&#x636E;
            SetPostData(item);
            //&#x8BBE;&#x7F6E;&#x6700;&#x5927;&#x8FDE;&#x63A5;
            if (item.Connectionlimit > 0) request.ServicePoint.ConnectionLimit = item.Connectionlimit;
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x8BC1;&#x4E66;
        /// </summary>
        /// <param name="item">
        private void SetCer(HttpItem item)
        {
            if (!string.IsNullOrWhiteSpace(item.CerPath))
            {
                //&#x8FD9;&#x4E00;&#x53E5;&#x4E00;&#x5B9A;&#x8981;&#x5199;&#x5728;&#x521B;&#x5EFA;&#x8FDE;&#x63A5;&#x7684;&#x524D;&#x9762;&#x3002;&#x4F7F;&#x7528;&#x56DE;&#x8C03;&#x7684;&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x8BC1;&#x4E66;&#x9A8C;&#x8BC1;&#x3002;
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
                //&#x521D;&#x59CB;&#x5316;&#x5BF9;&#x50CF;&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x8BF7;&#x6C42;&#x7684;URL&#x5730;&#x5740;
                request = (HttpWebRequest)WebRequest.Create(item.URL);
                SetCerList(item);
                //&#x5C06;&#x8BC1;&#x4E66;&#x6DFB;&#x52A0;&#x5230;&#x8BF7;&#x6C42;&#x91CC;
                request.ClientCertificates.Add(new X509Certificate(item.CerPath));
            }
            else
            {
                //&#x521D;&#x59CB;&#x5316;&#x5BF9;&#x50CF;&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x8BF7;&#x6C42;&#x7684;URL&#x5730;&#x5740;
                request = (HttpWebRequest)WebRequest.Create(item.URL);
                SetCerList(item);
            }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x591A;&#x4E2A;&#x8BC1;&#x4E66;
        /// </summary>
        /// <param name="item">
        private void SetCerList(HttpItem item)
        {
            if (item.ClentCertificates != null && item.ClentCertificates.Count > 0)
            {
                foreach (X509Certificate c in item.ClentCertificates)
                {
                    request.ClientCertificates.Add(c);
                }
            }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;Cookie
        /// </summary>
        /// <param name="item">Http&#x53C2;&#x6570;
        private void SetCookie(HttpItem item)
        {
            if (!string.IsNullOrEmpty(item.Cookie)) request.Headers[HttpRequestHeader.Cookie] = item.Cookie;
            //&#x8BBE;&#x7F6E;CookieCollection
            if (item.ResultCookieType == ResultCookieType.CookieCollection)
            {
                request.CookieContainer = new CookieContainer();
                if (item.CookieCollection != null && item.CookieCollection.Count > 0)
                    request.CookieContainer.Add(item.CookieCollection);
            }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;Post&#x6570;&#x636E;
        /// </summary>
        /// <param name="item">Http&#x53C2;&#x6570;
        private void SetPostData(HttpItem item)
        {
            //&#x9A8C;&#x8BC1;&#x5728;&#x5F97;&#x5230;&#x7ED3;&#x679C;&#x65F6;&#x662F;&#x5426;&#x6709;&#x4F20;&#x5165;&#x6570;&#x636E;
            if (!request.Method.Trim().ToLower().Contains("get"))
            {
                if (item.PostEncoding != null)
                {
                    postencoding = item.PostEncoding;
                }
                byte[] buffer = null;
                //&#x5199;&#x5165;Byte&#x7C7B;&#x578B;
                if (item.PostDataType == PostDataType.Byte && item.PostdataByte != null && item.PostdataByte.Length > 0)
                {
                    //&#x9A8C;&#x8BC1;&#x5728;&#x5F97;&#x5230;&#x7ED3;&#x679C;&#x65F6;&#x662F;&#x5426;&#x6709;&#x4F20;&#x5165;&#x6570;&#x636E;
                    buffer = item.PostdataByte;
                }//&#x5199;&#x5165;&#x6587;&#x4EF6;
                else if (item.PostDataType == PostDataType.FilePath && !string.IsNullOrWhiteSpace(item.Postdata))
                {
                    StreamReader r = new StreamReader(item.Postdata, postencoding);
                    buffer = postencoding.GetBytes(r.ReadToEnd());
                    r.Close();
                } //&#x5199;&#x5165;&#x5B57;&#x7B26;&#x4E32;
                else if (!string.IsNullOrWhiteSpace(item.Postdata))
                {
                    buffer = postencoding.GetBytes(item.Postdata);
                }
                if (buffer != null)
                {
                    request.ContentLength = buffer.Length;
                    request.GetRequestStream().Write(buffer, 0, buffer.Length);
                }
                else
                {
                    request.ContentLength = 0;
                }
            }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x4EE3;&#x7406;
        /// </summary>
        /// <param name="item">&#x53C2;&#x6570;&#x5BF9;&#x8C61;
        private void SetProxy(HttpItem item)
        {
            bool isIeProxy = false;
            if (!string.IsNullOrWhiteSpace(item.ProxyIp))
            {
                isIeProxy = item.ProxyIp.ToLower().Contains("ieproxy");
            }
            if (!string.IsNullOrWhiteSpace(item.ProxyIp) && !isIeProxy)
            {
                //&#x8BBE;&#x7F6E;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;
                if (item.ProxyIp.Contains(":"))
                {
                    string[] plist = item.ProxyIp.Split(':');
                    WebProxy myProxy = new WebProxy(plist[0].Trim(), Convert.ToInt32(plist[1].Trim()));
                    //&#x5EFA;&#x8BAE;&#x8FDE;&#x63A5;
                    myProxy.Credentials = new NetworkCredential(item.ProxyUserName, item.ProxyPwd);
                    //&#x7ED9;&#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;
                    request.Proxy = myProxy;
                }
                else
                {
                    WebProxy myProxy = new WebProxy(item.ProxyIp, false);
                    //&#x5EFA;&#x8BAE;&#x8FDE;&#x63A5;
                    myProxy.Credentials = new NetworkCredential(item.ProxyUserName, item.ProxyPwd);
                    //&#x7ED9;&#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x5BF9;&#x8C61;
                    request.Proxy = myProxy;
                }
            }
            else if (isIeProxy)
            {
                //&#x8BBE;&#x7F6E;&#x4E3A;IE&#x4EE3;&#x7406;
            }
            else
            {
                //request.Proxy = item.WebProxy;
            }
        }

        #endregion

        #region private main
        /// <summary>
        /// &#x56DE;&#x8C03;&#x9A8C;&#x8BC1;&#x8BC1;&#x4E66;&#x95EE;&#x9898;
        /// </summary>
        /// <param name="sender">&#x6D41;&#x5BF9;&#x8C61;
        /// <param name="certificate">&#x8BC1;&#x4E66;
        /// <param name="chain">X509Chain
        /// <param name="errors">SslPolicyErrors
        /// <returns>bool</returns>
        private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; }

        /// <summary>
        /// &#x901A;&#x8FC7;&#x8BBE;&#x7F6E;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x53D1;&#x51FA;&#x8FDE;&#x63A5;&#x7684;&#x65F6;&#x5019;&#x7ED1;&#x5B9A;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x51FA;&#x8FDE;&#x63A5;&#x6240;&#x4F7F;&#x7528;&#x7684;IP&#x5730;&#x5740;&#x3002;
        /// </summary>
        /// <param name="servicePoint">
        /// <param name="remoteEndPoint">
        /// <param name="retryCount">
        /// <returns></returns>
        private IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
        {
            return _IPEndPoint;//&#x7AEF;&#x53E3;&#x53F7;
        }
        #endregion
    }

    #region public calss
    /// <summary>
    /// Http&#x8BF7;&#x6C42;&#x53C2;&#x8003;&#x7C7B;
    /// </summary>
    public class HttpItem
    {
        /// <summary>
        /// &#x8BF7;&#x6C42;URL&#x5FC5;&#x987B;&#x586B;&#x5199;
        /// </summary>
        public string URL { get; set; }
        string _Method = "GET";
        /// <summary>
        /// &#x8BF7;&#x6C42;&#x65B9;&#x5F0F;&#x9ED8;&#x8BA4;&#x4E3A;GET&#x65B9;&#x5F0F;,&#x5F53;&#x4E3A;POST&#x65B9;&#x5F0F;&#x65F6;&#x5FC5;&#x987B;&#x8BBE;&#x7F6E;Postdata&#x7684;&#x503C;
        /// </summary>
        public string Method
        {
            get { return _Method; }
            set { _Method = value; }
        }
        int _Timeout = 100000;
        /// <summary>
        /// &#x9ED8;&#x8BA4;&#x8BF7;&#x6C42;&#x8D85;&#x65F6;&#x65F6;&#x95F4;
        /// </summary>
        public int Timeout
        {
            get { return _Timeout; }
            set { _Timeout = value; }
        }
        int _ReadWriteTimeout = 30000;
        /// <summary>
        /// &#x9ED8;&#x8BA4;&#x5199;&#x5165;Post&#x6570;&#x636E;&#x8D85;&#x65F6;&#x95F4;
        /// </summary>
        public int ReadWriteTimeout
        {
            get { return _ReadWriteTimeout; }
            set { _ReadWriteTimeout = value; }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;Host&#x7684;&#x6807;&#x5934;&#x4FE1;&#x606F;
        /// </summary>
        public string Host { get; set; }
        Boolean _KeepAlive = true;
        /// <summary>
        ///  &#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x503C;&#xFF0C;&#x8BE5;&#x503C;&#x6307;&#x793A;&#x662F;&#x5426;&#x4E0E; Internet &#x8D44;&#x6E90;&#x5EFA;&#x7ACB;&#x6301;&#x4E45;&#x6027;&#x8FDE;&#x63A5;&#x9ED8;&#x8BA4;&#x4E3A;true&#x3002;
        /// </summary>
        public Boolean KeepAlive
        {
            get { return _KeepAlive; }
            set { _KeepAlive = value; }
        }
        string _Accept = "text/html, application/xhtml+xml, */*";
        /// <summary>
        /// &#x8BF7;&#x6C42;&#x6807;&#x5934;&#x503C; &#x9ED8;&#x8BA4;&#x4E3A;text/html, application/xhtml+xml, */*
        /// </summary>
        public string Accept
        {
            get { return _Accept; }
            set { _Accept = value; }
        }
        string _ContentType = "text/html";
        /// <summary>
        /// &#x8BF7;&#x6C42;&#x8FD4;&#x56DE;&#x7C7B;&#x578B;&#x9ED8;&#x8BA4; text/html
        /// </summary>
        public string ContentType
        {
            get { return _ContentType; }
            set { _ContentType = value; }
        }
        string _UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
        /// <summary>
        /// &#x5BA2;&#x6237;&#x7AEF;&#x8BBF;&#x95EE;&#x4FE1;&#x606F;&#x9ED8;&#x8BA4;Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
        /// </summary>
        public string UserAgent
        {
            get { return _UserAgent; }
            set { _UserAgent = value; }
        }
        /// <summary>
        /// &#x8FD4;&#x56DE;&#x6570;&#x636E;&#x7F16;&#x7801;&#x9ED8;&#x8BA4;&#x4E3A;NUll,&#x53EF;&#x4EE5;&#x81EA;&#x52A8;&#x8BC6;&#x522B;,&#x4E00;&#x822C;&#x4E3A;utf-8,gbk,gb2312
        /// </summary>
        public Encoding Encoding { get; set; }
        private PostDataType _PostDataType = PostDataType.String;
        /// <summary>
        /// Post&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;
        /// </summary>
        public PostDataType PostDataType
        {
            get { return _PostDataType; }
            set { _PostDataType = value; }
        }
        /// <summary>
        /// Post&#x8BF7;&#x6C42;&#x65F6;&#x8981;&#x53D1;&#x9001;&#x7684;&#x5B57;&#x7B26;&#x4E32;Post&#x6570;&#x636E;
        /// </summary>
        public string Postdata { get; set; }
        /// <summary>
        /// Post&#x8BF7;&#x6C42;&#x65F6;&#x8981;&#x53D1;&#x9001;&#x7684;Byte&#x7C7B;&#x578B;&#x7684;Post&#x6570;&#x636E;
        /// </summary>
        public byte[] PostdataByte { get; set; }
        /// <summary>
        /// Cookie&#x5BF9;&#x8C61;&#x96C6;&#x5408;
        /// </summary>
        public CookieCollection CookieCollection { get; set; }
        /// <summary>
        /// &#x8BF7;&#x6C42;&#x65F6;&#x7684;Cookie
        /// </summary>
        public string Cookie { get; set; }
        /// <summary>
        /// &#x6765;&#x6E90;&#x5730;&#x5740;&#xFF0C;&#x4E0A;&#x6B21;&#x8BBF;&#x95EE;&#x5730;&#x5740;
        /// </summary>
        public string Referer { get; set; }
        /// <summary>
        /// &#x8BC1;&#x4E66;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;
        /// </summary>
        public string CerPath { get; set; }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x4EE3;&#x7406;&#x5BF9;&#x8C61;&#xFF0C;&#x4E0D;&#x60F3;&#x4F7F;&#x7528;IE&#x9ED8;&#x8BA4;&#x914D;&#x7F6E;&#x5C31;&#x8BBE;&#x7F6E;&#x4E3A;Null&#xFF0C;&#x800C;&#x4E14;&#x4E0D;&#x8981;&#x8BBE;&#x7F6E;ProxyIp
        /// </summary>
        public WebProxy WebProxy { get; set; }
        private Boolean isToLower = false;
        /// <summary>
        /// &#x662F;&#x5426;&#x8BBE;&#x7F6E;&#x4E3A;&#x5168;&#x6587;&#x5C0F;&#x5199;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x4E0D;&#x8F6C;&#x5316;
        /// </summary>
        public Boolean IsToLower
        {
            get { return isToLower; }
            set { isToLower = value; }
        }
        private Boolean allowautoredirect = false;
        /// <summary>
        /// &#x652F;&#x6301;&#x8DF3;&#x8F6C;&#x9875;&#x9762;&#xFF0C;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;&#x5C06;&#x662F;&#x8DF3;&#x8F6C;&#x540E;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;&#x4E0D;&#x8DF3;&#x8F6C;
        /// </summary>
        public Boolean Allowautoredirect
        {
            get { return allowautoredirect; }
            set { allowautoredirect = value; }
        }
        private int connectionlimit = 1024;
        /// <summary>
        /// &#x6700;&#x5927;&#x8FDE;&#x63A5;&#x6570;
        /// </summary>
        public int Connectionlimit
        {
            get { return connectionlimit; }
            set { connectionlimit = value; }
        }
        /// <summary>
        /// &#x4EE3;&#x7406;Proxy &#x670D;&#x52A1;&#x5668;&#x7528;&#x6237;&#x540D;
        /// </summary>
        public string ProxyUserName { get; set; }
        /// <summary>
        /// &#x4EE3;&#x7406; &#x670D;&#x52A1;&#x5668;&#x5BC6;&#x7801;
        /// </summary>
        public string ProxyPwd { get; set; }
        /// <summary>
        /// &#x4EE3;&#x7406; &#x670D;&#x52A1;IP,&#x5982;&#x679C;&#x8981;&#x4F7F;&#x7528;IE&#x4EE3;&#x7406;&#x5C31;&#x8BBE;&#x7F6E;&#x4E3A;ieproxy
        /// </summary>
        public string ProxyIp { get; set; }
        private ResultType resulttype = ResultType.String;
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x8FD4;&#x56DE;&#x7C7B;&#x578B;String&#x548C;Byte
        /// </summary>
        public ResultType ResultType
        {
            get { return resulttype; }
            set { resulttype = value; }
        }
        private WebHeaderCollection header = new WebHeaderCollection();
        /// <summary>
        /// header&#x5BF9;&#x8C61;
        /// </summary>
        public WebHeaderCollection Header
        {
            get { return header; }
            set { header = value; }
        }
        /// <summary>
        //     &#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E;&#x7528;&#x4E8E;&#x8BF7;&#x6C42;&#x7684; HTTP &#x7248;&#x672C;&#x3002;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;:&#x7528;&#x4E8E;&#x8BF7;&#x6C42;&#x7684; HTTP &#x7248;&#x672C;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; System.Net.HttpVersion.Version11&#x3002;
        /// </summary>
        public Version ProtocolVersion { get; set; }
        private Boolean _expect100continue = false;
        /// <summary>
        ///  &#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A; System.Boolean &#x503C;&#xFF0C;&#x8BE5;&#x503C;&#x786E;&#x5B9A;&#x662F;&#x5426;&#x4F7F;&#x7528; 100-Continue &#x884C;&#x4E3A;&#x3002;&#x5982;&#x679C; POST &#x8BF7;&#x6C42;&#x9700;&#x8981; 100-Continue &#x54CD;&#x5E94;&#xFF0C;&#x5219;&#x4E3A; true&#xFF1B;&#x5426;&#x5219;&#x4E3A; false&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; true&#x3002;
        /// </summary>
        public Boolean Expect100Continue
        {
            get { return _expect100continue; }
            set { _expect100continue = value; }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;509&#x8BC1;&#x4E66;&#x96C6;&#x5408;
        /// </summary>
        public X509CertificateCollection ClentCertificates { get; set; }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x6216;&#x83B7;&#x53D6;Post&#x53C2;&#x6570;&#x7F16;&#x7801;,&#x9ED8;&#x8BA4;&#x7684;&#x4E3A;Default&#x7F16;&#x7801;
        /// </summary>
        public Encoding PostEncoding { get; set; }
        private ResultCookieType _ResultCookieType = ResultCookieType.String;
        /// <summary>
        /// Cookie&#x8FD4;&#x56DE;&#x7C7B;&#x578B;,&#x9ED8;&#x8BA4;&#x7684;&#x662F;&#x53EA;&#x8FD4;&#x56DE;&#x5B57;&#x7B26;&#x4E32;&#x7C7B;&#x578B;
        /// </summary>
        public ResultCookieType ResultCookieType
        {
            get { return _ResultCookieType; }
            set { _ResultCookieType = value; }
        }
        private ICredentials _ICredentials = CredentialCache.DefaultCredentials;
        /// <summary>
        /// &#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E;&#x8BF7;&#x6C42;&#x7684;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x4FE1;&#x606F;&#x3002;
        /// </summary>
        public ICredentials ICredentials
        {
            get { return _ICredentials; }
            set { _ICredentials = value; }
        }
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x8BF7;&#x6C42;&#x5C06;&#x8DDF;&#x968F;&#x7684;&#x91CD;&#x5B9A;&#x5411;&#x7684;&#x6700;&#x5927;&#x6570;&#x76EE;
        /// </summary>
        public int MaximumAutomaticRedirections { get; set; }
        private DateTime? _IfModifiedSince = null;
        /// <summary>
        /// &#x83B7;&#x53D6;&#x548C;&#x8BBE;&#x7F6E;IfModifiedSince&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x548C;&#x65F6;&#x95F4;
        /// </summary>
        public DateTime? IfModifiedSince
        {
            get { return _IfModifiedSince; }
            set { _IfModifiedSince = value; }
        }
        #region ip-port
        private IPEndPoint _IPEndPoint = null;
        /// <summary>
        /// &#x8BBE;&#x7F6E;&#x672C;&#x5730;&#x7684;&#x51FA;&#x53E3;ip&#x548C;&#x7AEF;&#x53E3;
        /// </summary>]
        /// <example>
        ///item.IPEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.1"),80);
        /// </example>
        public IPEndPoint IPEndPoint
        {
            get { return _IPEndPoint; }
            set { _IPEndPoint = value; }
        }
        #endregion

        private bool _isReset = false;
        /// <summary>
        /// &#x662F;&#x5426;&#x91CD;&#x7F6E;request,response&#x7684;&#x503C;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E0D;&#x91CD;&#x7F6E;&#xFF0C;&#x5F53;&#x8BBE;&#x7F6E;&#x4E3A;True&#x65F6;request,response&#x5C06;&#x88AB;&#x8BBE;&#x7F6E;&#x4E3A;Null
        /// </summary>
        public bool IsReset
        {
            get { return _isReset; }
            set { _isReset = value; }
        }
    }
    /// <summary>
    /// Http&#x8FD4;&#x56DE;&#x53C2;&#x6570;&#x7C7B;
    /// </summary>
    public class HttpResult
    {
        /// <summary>
        /// Http&#x8BF7;&#x6C42;&#x8FD4;&#x56DE;&#x7684;Cookie
        /// </summary>
        public string Cookie { get; set; }
        /// <summary>
        /// Cookie&#x5BF9;&#x8C61;&#x96C6;&#x5408;
        /// </summary>
        public CookieCollection CookieCollection { get; set; }
        private string _html = string.Empty;
        /// <summary>
        /// &#x8FD4;&#x56DE;&#x7684;String&#x7C7B;&#x578B;&#x6570;&#x636E; &#x53EA;&#x6709;ResultType.String&#x65F6;&#x624D;&#x8FD4;&#x56DE;&#x6570;&#x636E;&#xFF0C;&#x5176;&#x5B83;&#x60C5;&#x51B5;&#x4E3A;&#x7A7A;
        /// </summary>
        public string Html
        {
            get { return _html; }
            set { _html = value; }
        }
        /// <summary>
        /// &#x8FD4;&#x56DE;&#x7684;Byte&#x6570;&#x7EC4; &#x53EA;&#x6709;ResultType.Byte&#x65F6;&#x624D;&#x8FD4;&#x56DE;&#x6570;&#x636E;&#xFF0C;&#x5176;&#x5B83;&#x60C5;&#x51B5;&#x4E3A;&#x7A7A;
        /// </summary>
        public byte[] ResultByte { get; set; }
        /// <summary>
        /// header&#x5BF9;&#x8C61;
        /// </summary>
        public WebHeaderCollection Header { get; set; }
        /// <summary>
        /// &#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x8BF4;&#x660E;
        /// </summary>
        public string StatusDescription { get; set; }
        /// <summary>
        /// &#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;,&#x9ED8;&#x8BA4;&#x4E3A;OK
        /// </summary>
        public HttpStatusCode StatusCode { get; set; }
        /// <summary>
        /// &#x6700;&#x540E;&#x8BBF;&#x95EE;&#x7684;URl
        /// </summary>
        public string ResponseUri { get; set; }
        /// <summary>
        /// &#x83B7;&#x53D6;&#x91CD;&#x5B9A;&#x5411;&#x7684;URl
        /// </summary>
        public string RedirectUrl
        {
            get
            {
                try
                {
                    if (Header != null && Header.Count > 0)
                    {
                        if (Header.AllKeys.Any(k => k.ToLower().Contains("location")))
                        {
                            string baseurl = Header["location"].ToString().Trim();
                            string locationurl = baseurl.ToLower();
                            if (!string.IsNullOrWhiteSpace(locationurl))
                            {
                                bool b = locationurl.StartsWith("http://") || locationurl.StartsWith("https://");
                                if (!b)
                                {
                                    baseurl = new Uri(new Uri(ResponseUri), baseurl).AbsoluteUri;
                                }
                            }
                            return baseurl;
                        }
                    }
                }
                catch { }
                return string.Empty;
            }
        }

        public CookieContainer CookieContainer { get; set; }
    }
    /// <summary>
    /// &#x8FD4;&#x56DE;&#x7C7B;&#x578B;
    /// </summary>
    public enum ResultType
    {
        /// <summary>
        /// &#x8868;&#x793A;&#x53EA;&#x8FD4;&#x56DE;&#x5B57;&#x7B26;&#x4E32; &#x53EA;&#x6709;Html&#x6709;&#x6570;&#x636E;
        /// </summary>
        String,
        /// <summary>
        /// &#x8868;&#x793A;&#x8FD4;&#x56DE;&#x5B57;&#x7B26;&#x4E32;&#x548C;&#x5B57;&#x8282;&#x6D41; ResultByte&#x548C;Html&#x90FD;&#x6709;&#x6570;&#x636E;&#x8FD4;&#x56DE;
        /// </summary>
        Byte
    }
    /// <summary>
    /// Post&#x7684;&#x6570;&#x636E;&#x683C;&#x5F0F;&#x9ED8;&#x8BA4;&#x4E3A;string
    /// </summary>
    public enum PostDataType
    {
        /// <summary>
        /// &#x5B57;&#x7B26;&#x4E32;&#x7C7B;&#x578B;&#xFF0C;&#x8FD9;&#x65F6;&#x7F16;&#x7801;Encoding&#x53EF;&#x4E0D;&#x8BBE;&#x7F6E;
        /// </summary>
        String,
        /// <summary>
        /// Byte&#x7C7B;&#x578B;&#xFF0C;&#x9700;&#x8981;&#x8BBE;&#x7F6E;PostdataByte&#x53C2;&#x6570;&#x7684;&#x503C;&#x7F16;&#x7801;Encoding&#x53EF;&#x8BBE;&#x7F6E;&#x4E3A;&#x7A7A;
        /// </summary>
        Byte,
        /// <summary>
        /// &#x4F20;&#x6587;&#x4EF6;&#xFF0C;Postdata&#x5FC5;&#x987B;&#x8BBE;&#x7F6E;&#x4E3A;&#x6587;&#x4EF6;&#x7684;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;&#xFF0C;&#x5FC5;&#x987B;&#x8BBE;&#x7F6E;Encoding&#x7684;&#x503C;
        /// </summary>
        FilePath
    }
    /// <summary>
    /// Cookie&#x8FD4;&#x56DE;&#x7C7B;&#x578B;
    /// </summary>
    public enum ResultCookieType
    {
        /// <summary>
        /// &#x53EA;&#x8FD4;&#x56DE;&#x5B57;&#x7B26;&#x4E32;&#x7C7B;&#x578B;&#x7684;Cookie
        /// </summary>
        String,
        /// <summary>
        /// CookieCollection&#x683C;&#x5F0F;&#x7684;Cookie&#x96C6;&#x5408;&#x540C;&#x65F6;&#x4E5F;&#x8FD4;&#x56DE;String&#x7C7B;&#x578B;&#x7684;cookie
        /// </summary>
        CookieCollection
    }
    #endregion
}

</meta[^<]*charset=([^<]*)[\"']",>

封装后的Request

点击查看代码

        private HttpResult Request(HttpItem item, CookieContainer cookieContainer)
        {
            HttpHelper http = new HttpHelper();
            var uri = new Uri(item.URL);
            if (item.Header == null)
            {
                item.Header = new WebHeaderCollection();
            }
            item.Header.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
            item.Header.Add(HttpRequestHeader.AcceptLanguage, "zh-Hans-CN,zh-Hans;q=0.5");

            item.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko";
            item.ResultCookieType = ResultCookieType.CookieCollection;
            item.ProtocolVersion = HttpVersion.Version11;
            item.CookieCollection = cookieContainer.GetCookies(uri);
            var a = http.GetHtml(item);

            if (a.CookieCollection != null && a.CookieCollection.Count > 0)
            {
                foreach (Cookie cookie in a.CookieCollection)
                {
                    if (cookie.Path == uri.LocalPath)
                    {
                        var arr = uri.LocalPath.Split('/');
                        if (arr.Length >= 2)
                            cookie.Path = "/" + arr[1];
                    }
                }
                cookieContainer.Add(a.CookieCollection);
            }
            a.CookieContainer = cookieContainer;
            return a;
        }

关于请求的调试

在使用http请求时,发现代码发起的请求和浏览器发起的请求很相似但是响应的内容差距非常大,那么可以使用fiddler工具的数据重发功能和调试功能,不断进行数据重发并修改请求头和请求体找出代码请求和浏览器请求的区别,从而找到问题。

Original: https://www.cnblogs.com/haowuji/p/15900242.html
Author: 下-个路口
Title: 简单记录CookieCollection的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607273/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • linux学习之搭建Apache 服务器

    本实验的主要任务是在CentOS操作系统中搭建Apache 服务器,练习文档根目录、首页文件、相关访间控制规则的配置。 ‎【实验目的】 ‎(1) 理解Apache 服务器主配置文件…

    Linux 2023年6月13日
    092
  • sed用法

    基础sed命令 sed OPTIONS… [SCRIPT] [INPUTFILE…] 常用的选项: -n,–quiet: 不输出模式空间中的内容 -i: 直…

    Linux 2023年6月6日
    0119
  • Redis分布式锁的N种姿势

    Redis几种架构 Redis发展到现在,几种常见的部署架构有: 单机模式; 主从模式; 哨兵模式; 集群模式; 我们首先基于这些架构讲解Redisson普通分布式锁实现,需要注意…

    Linux 2023年5月28日
    093
  • js学习笔记——条件 循环

    今天发现之前学的爱前端的课中JS部分函数等不全,果断换了一个课——渡一的《Web前端开发JavaScript高薪课堂》接着学习,不过废话有点多 语法:1、单if,条件成立,执行语句…

    Linux 2023年6月13日
    058
  • JuiceFS v1.0 正式发布,首个面向生产环境的 LTS 版本

    今天,JuiceFS v1.0 发布了 🎉 经过了 18 个月的持续迭代和大量生产环境的广泛验证,此版本将成为第一个被长期维护的稳定版(LTS)。同时,该版本提供完整的向前兼容,所…

    Linux 2023年6月14日
    088
  • 【原创】Linux PCI驱动框架分析(二)

    背 景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. &#8211…

    Linux 2023年6月8日
    094
  • 大数据之Hadoop集群中Yarn常用命令

    Yarn状态的查询,除了可以在hadoop103:8088页面查看以外,还可以通过命令操作。常见的命令操作如下所示。 启动集群 [hadoop@hadoop102 bin]$ my…

    Linux 2023年6月8日
    0118
  • 如何使用CMake构建c++项目

    1. c++项目构建与CMake简介 在Windows系统上我们通常使用 Visual Studio(VS)来生成我们的c++项目。我们只需在VS相应的层次目录中添加相应的文件即可…

    Linux 2023年5月27日
    0203
  • chmod 报错 changing permissions of ‘xxx’: Operation not permitted

    chmod的底层实现是 chattr命令,用此命的功能更为强大,甚至可以锁定文件,即使root用户也操作不了此文件。 先使用lsattr查看文件属性 `bashlsattr tem…

    Linux 2023年6月13日
    084
  • 【redis使用全解析】常见运维操作

    $ redis-server redis.conf 常见选项: ./redis-server (run the server with default conf) ./redis-…

    Linux 2023年5月28日
    064
  • 001 研发同学必学哪些 Linux 命令?

    身为研发同学,Linux 是绕不过去的一个小山包,不是说要掌握的十分精通,在程序员界里做个极客,也不是说要抢了 Devops 同学的饭碗,但至少要做到摆脱对 Linux 命令认知的…

    Linux 2023年5月27日
    079
  • Quartus II 13.0 sp1的官方下载页面

    今天为了下个ModelSim跑到网上去找下载资源,清一色的百度网盘,下载速度60k/s,简直有病,于是跑到Intel官网上把连接挖出来了,供各位直接下载 实测使用IDM多线程下载速…

    Linux 2023年6月13日
    0162
  • Docker私有仓库部署

    修改daemon.json 重启docker服务 镜像上传至私有仓库 标记此镜像为私有仓库的镜像 再次启动私服容器 Original: https://www.cnblogs.co…

    Linux 2023年6月8日
    062
  • [20211105]索引分裂 块清除 日志增加.txt

    [20211105]索引分裂 块清除 日志增加.txt –//题目起的有点怪,只是我昨天在测试时遇到的怪问题,我通过测试环境演示出来。–//当非主键索引发生…

    Linux 2023年6月13日
    086
  • VIM快捷键全集

    VIM快捷键大法 vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效。 如果是初学vi…

    Linux 2023年6月7日
    086
  • aspx.designer.cs没有自动生成代码(没有自动注册)

    遇到这个问题的最大可能是:aspx页面存在bug。 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自…

    Linux 2023年6月7日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球