zoukankan      html  css  js  c++  java
  • 中转Http请求

    应用场景:公司与外部公司数据对接,外部公司需申请指定IP访问。而本地ip经常变动,无法因ip变动时刻向外部公司申请绑定IP,给本地程序调试带来麻烦,故只能在指定ip服务器上搭建请求中转http请求;

    /// <summary>
        /// 中转 绑定ip中转请求;参数Base64解密,gzip压缩返回;
        /// kk 
        /// </summary>
        public class tc : IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                Dictionary<string, string> dict = AnaylerUrlParaGet(context.Request);
                if (dict.Count == 0 || string.IsNullOrEmpty(dict["url"]) || string.IsNullOrEmpty(dict["postdata"]))
                {
                    context.Response.ContentType = "text/plain";
                    context.Response.Write("no post data");
                    context.Response.End();
                }
                HttpUtil _httputil = new HttpUtil();
                string strurl = Base64.DecodeBase64IgnoreEmpty(dict["url"]);
                string strJson = Base64.DecodeBase64IgnoreEmpty(dict["postdata"]);
                string strcontext = _httputil.HttpPost(strurl, strJson, System.Text.Encoding.UTF8);
                context.Response.ContentType = "application/octet-stream";
                context.Response.BinaryWrite(Common.EncryptHelper.Compress(strcontext));
                context.Response.Flush();
                context.Response.End();
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 获取GET参数
            /// </summary>
            /// <param name="req"></param>
            /// <returns></returns>
            public Dictionary<string, string> AnaylerUrlParaGet(System.Web.HttpRequest req)
            {
                Dictionary<string, string> dict = new Dictionary<string, string>();
                string tmp1;
                string tmp2;
                System.Collections.Specialized.NameValueCollection col = req.QueryString;
                for (int i = 0; i < col.Count; i++)
                {
                    tmp1 = col.AllKeys[i].Trim();
                    tmp2 = col[i].Trim();
                    if (!dict.ContainsKey(tmp1))
                    {
                        dict.Add(tmp1, tmp2);
                    }
                }
                return dict;
            }
        }
    View Code

    调用:

     private string PolicyMethod(object req, string strurl)
            {
                string result = string.Empty;
                try
                {
                    string BindUrl = "http://http://localhost:3600/tc.ashx"; //服务器对应ip地址
                    string strdata = GZipUtils.Compress(SerializeUtil.SerializeXml(req), Encoding.Unicode); 
                    string url = BindUrl + "?url=" + Base64.EncodeBase64IgnoreEmpty(strurl) + "&postdata=" + Base64.EncodeBase64IgnoreEmpty(strdata);
    
                    result = _httputil.HttpGet(url, System.Text.Encoding.UTF8, "gzip", 20); 
                }
                catch (Exception ex)
                {
                    LogUtils.Debug("PolicyMethod出错:" + ex.Message);
                }
                return result;
            }
    View Code

    HttpUtil帮助类:

    public class HttpUtil
        {
            public string HttpPost(string url, string data, Encoding encoding)
            {
                return HttpPost(url, data, "text/plain", encoding);
            }
    
            public string HttpGet(string url, Encoding encoding)
            {
                return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET");
            }
    
            public string HttpGet(string url, Encoding encoding, int timeout)
            {
                return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, "", timeout);
            }
            public string HttpGet(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null, string Strcompress = "", int timeout = 0)
            {
                return HttpSend(url, data, contenttype, encoding, "GET", Headers, Strcompress, timeout);
            }
    
            public string HttpGet(string url, Encoding encoding, string Strcompress, int timeout = 0)
            {
                return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, Strcompress, timeout);
            }
    
            public string HttpGet2(string url, Encoding encoding, string Strcompress, int timeout = 0)
            {
                return HttpSend2(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, Strcompress, timeout);
            }
    
            public string HttpGet(string url, string contenttype, Encoding encoding)
            {
                return HttpSend(url, "", contenttype, Encoding.GetEncoding("utf-8"), "GET");
            }
    
            public string HttpPost(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null, string Strcompress = "", int timeout = 0)
            {
                return HttpSend(url, data, contenttype, encoding, "POST", Headers, Strcompress, timeout);
            }
            public string HttpPut(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null)
            {
                return HttpSend(url, data, contenttype, encoding, "PUT", Headers);
            }
    
            private string HttpSend(string url, string data, string contenttype, Encoding encoding, string method, Dictionary<string, string> Headers = null, string Strcompress = ""
                , int timeout = 0)
            {
                try
                {
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                    if (Strcompress == "gzip")
                    {
                        request.Headers.Add("Accept-Encoding", "gzip");
                    }
                    if (timeout > 0)
                    {
                        request.Timeout = timeout * 1000;
                    }
                    request.Method = method;
                    if (!string.IsNullOrEmpty(contenttype))
                        request.ContentType = contenttype;
                    //设置Header信息
                    if (Headers != null && Headers.Count > 0)
                    {
                        foreach (KeyValuePair<string, string> item in Headers)
                            if (!string.IsNullOrEmpty(item.Key) && !string.IsNullOrEmpty(item.Value))
                                request.Headers.Add(item.Key, item.Value);
                    }
                    if (data != "")
                    {
                        byte[] bs = encoding.GetBytes(data);
                        request.ContentLength = bs.Length;
                        request.Timeout = 120 * 1000;
                        using (Stream reqStream = request.GetRequestStream())
                        {
                            reqStream.Write(bs, 0, bs.Length);
                        }
                    }
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
                    Stream stream = response.GetResponseStream();
    
                    if (Strcompress == "gzip")
                        stream = new GZipStream(stream, CompressionMode.Decompress);
                    //if (response.ContentEncoding.ToLower().Contains("gzip"))
                    //    stream = new GZipStream(stream, CompressionMode.Decompress);
                    //else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    //    stream = new DeflateStream(stream, CompressionMode.Decompress);
    
                    MemoryStream memoryStream = new MemoryStream();
                    int bufferLength = 1024;
                    byte[] b = new byte[bufferLength];
    
                    int actual;
    
                    while ((actual = stream.Read(b, 0, bufferLength)) > 0)
                    {
                        memoryStream.Write(b, 0, actual);
                    }
                    memoryStream.Position = 0;
    
                    byte[] bt = memoryStream.ToArray();
    
                    //无视编码
                    //if (encoding == null)
                    //{
                    string temp = Encoding.Default.GetString(bt, 0, bt.Length);
                    //<meta(.*?)charset([s]?)=[^>](.*?)>
                    Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)["']", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                    string charter = (meta.Groups.Count > 2) ? meta.Groups[2].Value : string.Empty;
                    charter = charter.Replace(""", string.Empty).Replace("'", string.Empty).Replace(";", string.Empty);
                    if (charter.Length > 0)
                    {
                        charter = charter.ToLower().Replace("iso-8859-1", "gbk");
                        encoding = Encoding.GetEncoding(charter);
                    }
                    else
                    {
                        if (response.CharacterSet != null)
                        {
                            if (response.CharacterSet.ToLower().Trim() == "iso-8859-1")
                            {
                                encoding = Encoding.GetEncoding("gbk");
                            }
                            else
                            {
                                if (string.IsNullOrEmpty(response.CharacterSet.Trim()))
                                {
                                    encoding = Encoding.UTF8;
                                }
                                else
                                {
                                    encoding = Encoding.GetEncoding(response.CharacterSet);
                                }
                            }
                        }
                    }
                    //}
    
                    stream.Close();
                    stream.Dispose();
                    response.Close();
    
    
    
                    return encoding.GetString(bt);
                }
                catch (Exception e)
                {
                    LogUtils.Debug(e.Message);
                    return "";
                }
            }
    
            private string HttpSend2(string url, string data, string contenttype, Encoding encoding, string method, Dictionary<string, string> Headers = null, string Strcompress = ""
                , int timeout = 0)
            {
                try
                {
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                    if (Strcompress == "gzip")
                    {
                        request.Headers.Add("Accept-Encoding", "gzip");
                    }
                    if (timeout > 0)
                    {
                        request.Timeout = timeout * 1000;
                    }
                    request.Method = method;
                    if (!string.IsNullOrEmpty(contenttype))
                        request.ContentType = contenttype;
                    //设置Header信息
                    if (Headers != null && Headers.Count > 0)
                    {
                        foreach (KeyValuePair<string, string> item in Headers)
                            if (!string.IsNullOrEmpty(item.Key) && !string.IsNullOrEmpty(item.Value))
                                request.Headers.Add(item.Key, item.Value);
                    }
                    if (data != "")
                    {
                        byte[] bs = encoding.GetBytes(data);
                        request.ContentLength = bs.Length;
                        request.Timeout = 120 * 1000;
                        using (Stream reqStream = request.GetRequestStream())
                        {
                            reqStream.Write(bs, 0, bs.Length);
                        }
                    }
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
                    Stream stream = response.GetResponseStream();
    
                    if (Strcompress == "gzip")
                        stream = new GZipStream(stream, CompressionMode.Decompress);
                    //if (response.ContentEncoding.ToLower().Contains("gzip"))
                    //    stream = new GZipStream(stream, CompressionMode.Decompress);
                    //else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    //    stream = new DeflateStream(stream, CompressionMode.Decompress);
    
                    //stream = new GZipStream(stream, CompressionMode.Decompress);
    
                    MemoryStream memoryStream = new MemoryStream();
                    int bufferLength = 1024;
                    byte[] b = new byte[bufferLength];
    
                    int actual;
    
                    while ((actual = stream.Read(b, 0, bufferLength)) > 0)
                    {
                        memoryStream.Write(b, 0, actual);
                    }
                    memoryStream.Position = 0;
    
                    byte[] bt = memoryStream.ToArray();
    
                    //无视编码
                    //if (encoding == null)
                    //{
                    string temp = Encoding.Default.GetString(bt, 0, bt.Length);
                    //<meta(.*?)charset([s]?)=[^>](.*?)>
                    Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)["']", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                    string charter = (meta.Groups.Count > 2) ? meta.Groups[2].Value : string.Empty;
                    charter = charter.Replace(""", string.Empty).Replace("'", string.Empty).Replace(";", string.Empty);
                    if (charter.Length > 0)
                    {
                        charter = charter.ToLower().Replace("iso-8859-1", "gbk");
                        encoding = Encoding.GetEncoding(charter);
                    }
                    else
                    {
                        if (response.CharacterSet.ToLower().Trim() == "iso-8859-1")
                        {
                            encoding = Encoding.GetEncoding("gbk");
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(response.CharacterSet.Trim()))
                            {
                                encoding = Encoding.UTF8;
                            }
                            else
                            {
                                encoding = Encoding.GetEncoding(response.CharacterSet);
                            }
                        }
                    }
                    //}
    
                    stream.Close();
                    stream.Dispose();
                    response.Close();
    
    
    
                    return encoding.GetString(bt);
                }
                catch (Exception e)
                {
                    return e.Message;
                    LogUtils.Debug(e.Message);
                    return "";
                }
            }
    
    
            /// <summary>
            /// 以指定编码通过POST方式发送数据。
            /// </summary>
            /// <param name="Url">url</param>
            /// <param name="postString">Post数据</param>
            /// <returns></returns>
            public string PostString(string Url, string postString, Encoding ed)
            {
                var data = ed.GetBytes(postString);
    
                var request = (HttpWebRequest)WebRequest.Create(Url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;
                using (var wStream = request.GetRequestStream())
                {
                    wStream.Write(data, 0, data.Length);
                }
    
                var response = (HttpWebResponse)request.GetResponse();
                var rt = string.Empty;
                using (var rStream = new StreamReader(response.GetResponseStream(), ed))
                {
                    rt = rStream.ReadToEnd();
                }
                response.Close();
    
                return rt;
            }
    
            /// <summary>
            /// 以utf-8编码通过POST方式发送数据。
            /// </summary>
            /// <param name="Url">url</param>
            /// <param name="postString">Post数据</param>
            /// <returns></returns>
            public string PostString_UTF8(string Url, string postString)
            {
                return PostString(Url, postString, Encoding.UTF8);
            }
    
        }
    View Code

    Base64帮助类:

    public class Base64
        {
            /// <summary> 
            /// Base64加密 
            /// </summary> 
            /// <param name="codeName">加密采用的编码方式</param> 
            /// <param name="source">待加密的明文</param> 
            /// <returns></returns> 
            public static string EncodeBase64(Encoding encode, string source)
            {
                string result = string.Empty;
                byte[] bytes = encode.GetBytes(source);
                try
                {
                    result = Convert.ToBase64String(bytes);
                }
                catch
                {
                    result = source;
                }
                return result;
            }
    
            /// <summary> 
            /// Base64加密,采用utf8编码方式加密 
            /// </summary> 
            /// <param name="source">待加密的明文</param> 
            /// <returns>加密后的字符串</returns> 
            public static string EncodeBase64(string source)
            {
                return EncodeBase64(Encoding.UTF8, source);
            }
    
            /// <summary> 
            /// Base64解密 
            /// </summary> 
            /// <param name="codeName">解密采用的编码方式,注意和加密时采用的方式一致</param> 
            /// <param name="result">待解密的密文</param> 
            /// <returns>解密后的字符串</returns> 
            public static string DecodeBase64(Encoding encode, string result)
            {
                string decode = "";
                byte[] bytes = Convert.FromBase64String(result);
                try
                {
                    decode = encode.GetString(bytes);
                }
                catch
                {
                    decode = result;
                }
                return decode;
            }
    
            /// <summary> 
            /// Base64解密,采用utf8编码方式解密 
            /// </summary> 
            /// <param name="result">待解密的密文</param> 
            /// <returns>解密后的字符串</returns> 
            public static string DecodeBase64(string result)
            {
                return DecodeBase64(Encoding.UTF8, result);
            }
    
    
            /// <summary> 
            /// Base64解密,采用utf8编码方式解密 
            /// </summary> 
            /// <param name="result">待解密的密文</param> 
            /// <returns>解密后的字符串</returns> 
            public static string DecodeBase64IgnoreEmpty(string result)
            {
                return DecodeBase64(Encoding.UTF8, result.Replace("+", "%2B"));
            }
    
            /// <summary> 
            /// Base64加密,采用utf8编码方式加密 
            /// </summary> 
            /// <param name="source">待加密的明文</param> 
            /// <returns>加密后的字符串</returns> 
            public static string EncodeBase64IgnoreEmpty(string source)
            {
                return EncodeBase64(Encoding.UTF8, source.Replace("%2B", "+"));
            }
        }
    View Code

     EncryptHelper帮助类:

     public class EncryptHelper
        {
            /// <summary>
            /// MD5
            /// </summary>
            /// <param name="str"></param>
            /// <param name="code"></param>
            /// <returns></returns>
            public static string MD5(string str, int code)
            {
                if (code == 16) //16位MD5加密(取32位加密的9~25字符)
                {
                    return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
                }
                if (code == 32) //32位加密
                {
                    return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
                }
                return "00000000000000000000000000000000";
    
            }
    
            /// <summary>
            /// AES加密函数(128位) 加密模式:AES/CBC/PKCS5Padding  加密初始化向量:长度为  16 的空字节数组
            /// </summary>
            /// <param name="toEncrypt"></param>
            /// <returns></returns>
            public static string Encrypt(string toEncrypt,string key)
            {
                byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
                byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
    
                RijndaelManaged rDel = new RijndaelManaged();
                rDel.IV = new byte[16];
                rDel.Key = keyArray;
                rDel.Mode = CipherMode.CBC;
                rDel.Padding = PaddingMode.PKCS7;
    
                ICryptoTransform cTransform = rDel.CreateEncryptor();
                byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    
                return Convert.ToBase64String(resultArray, 0, resultArray.Length);
            }
    
            /// <summary>
            /// AES解密函数(128位)
            /// </summary>
            /// <param name="toDecrypt"></param>
            /// <returns></returns>
            public static string Decrypt(string toDecrypt, string key)
            {
                byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
                byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
    
                RijndaelManaged rDel = new RijndaelManaged();
                rDel.IV = new byte[16];
                rDel.Key = keyArray;
                rDel.Mode = CipherMode.CBC;
                rDel.Padding = PaddingMode.PKCS7;
    
                ICryptoTransform cTransform = rDel.CreateDecryptor();
                byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    
                return UTF8Encoding.UTF8.GetString(resultArray);
            }
    
    
    
    
            public static string Encrypt2(string toEncrypt)
            {
                StringBuilder sb = new StringBuilder();
                int asc = 0;
                foreach (char c in toEncrypt)
                {
                    asc = (int)c;
                    sb.Append(Convert.ToString(asc, 8) + "9");
                }
    
                return sb.ToString();
            }
    
            public static string Decrypt2(string toEncrypt)
            {
                string[] ss = toEncrypt.Split(new char[] { '9' }, StringSplitOptions.RemoveEmptyEntries);
                StringBuilder sb = new StringBuilder();
                foreach (string s in ss)
                {
                    sb.Append(Convert.ToChar(Convert.ToInt32(s, 8)).ToString());
                }
    
                return sb.ToString();
            }
    
            /// <summary>
            /// GZip解压
            /// </summary>
            /// <param name="inputStr"></param>
            /// <returns></returns>
            public static string Decompress(string inputStr)
            {
                byte[] bs = Convert.FromBase64String(inputStr);
                MemoryStream ms = new MemoryStream(bs);
                GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress);
    
                string result = "";
                using (StreamReader sr = new StreamReader(zipStream))
                {
                    result = sr.ReadToEnd();
                }
    
                zipStream.Close();
                ms.Dispose();
                ms.Close();
    
                return result;
            }
    
            /// <summary>
            /// GZip压缩
            /// </summary>
            /// <param name="inputStr"></param>
            /// <returns></returns>
            public static byte[] Compress(string inputStr)
            {
                //if (string.IsNullOrEmpty(inputStr))
                //{
                //    return "";
                //}
    
                byte[] bs = Encoding.UTF8.GetBytes(inputStr);
    
                MemoryStream ms = new MemoryStream();
                using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress, true))
                {
                    zipStream.Write(bs, 0, bs.Length);
                }
    
                return ms.ToArray();
    
                //byte[] res = ms.ToArray();
    
                //ms.Dispose();
                //ms.Close();
                //return Convert.ToBase64String(res);
            }
    
        }
    View Code
  • 相关阅读:
    内存泄漏的原因及解决
    满足两阶段封锁协议的事务
    configure,make和make install关系
    Go语言Hello world(GOPATH和Go Module版)
    分享一个让我进入阿里中间件的个人项目
    Go语言入门:Hello world
    你好,Go语言
    LeetCode刷题
    iis与 asp.net管道(asp.net应用程序什么周期)
    nhibernate+autofac+mvc的demo
  • 原文地址:https://www.cnblogs.com/systemkk/p/5366661.html
Copyright © 2011-2022 走看看