应用场景:公司与外部公司数据对接,外部公司需申请指定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 == || 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 = ; i < col.Count; i++)
{
tmp1 = col.AllKeys[i].Trim();
tmp2 = col[i].Trim();
if (!dict.ContainsKey(tmp1))
{
dict.Add(tmp1, tmp2);
}
}
return dict;
}
}

调用:

 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", );
}
catch (Exception ex)
{
LogUtils.Debug("PolicyMethod出错:" + ex.Message);
}
return result;
}

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 = )
{
return HttpSend(url, data, contenttype, encoding, "GET", Headers, Strcompress, timeout);
} public string HttpGet(string url, Encoding encoding, string Strcompress, int timeout = )
{
return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, Strcompress, timeout);
} public string HttpGet2(string url, Encoding encoding, string Strcompress, int timeout = )
{
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 = )
{
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 = )
{
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
if (Strcompress == "gzip")
{
request.Headers.Add("Accept-Encoding", "gzip");
}
if (timeout > )
{
request.Timeout = timeout * ;
}
request.Method = method;
if (!string.IsNullOrEmpty(contenttype))
request.ContentType = contenttype;
//设置Header信息
if (Headers != null && Headers.Count > )
{
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 = * ;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bs, , 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 = ;
byte[] b = new byte[bufferLength]; int actual; while ((actual = stream.Read(b, , bufferLength)) > )
{
memoryStream.Write(b, , actual);
}
memoryStream.Position = ; byte[] bt = memoryStream.ToArray(); //无视编码
//if (encoding == null)
//{
string temp = Encoding.Default.GetString(bt, , bt.Length);
//<meta(.*?)charset([\s]?)=[^>](.*?)>
Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)[\"']", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string charter = (meta.Groups.Count > ) ? meta.Groups[].Value : string.Empty;
charter = charter.Replace("\"", string.Empty).Replace("'", string.Empty).Replace(";", string.Empty);
if (charter.Length > )
{
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 = )
{
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
if (Strcompress == "gzip")
{
request.Headers.Add("Accept-Encoding", "gzip");
}
if (timeout > )
{
request.Timeout = timeout * ;
}
request.Method = method;
if (!string.IsNullOrEmpty(contenttype))
request.ContentType = contenttype;
//设置Header信息
if (Headers != null && Headers.Count > )
{
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 = * ;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bs, , 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 = ;
byte[] b = new byte[bufferLength]; int actual; while ((actual = stream.Read(b, , bufferLength)) > )
{
memoryStream.Write(b, , actual);
}
memoryStream.Position = ; byte[] bt = memoryStream.ToArray(); //无视编码
//if (encoding == null)
//{
string temp = Encoding.Default.GetString(bt, , bt.Length);
//<meta(.*?)charset([\s]?)=[^>](.*?)>
Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)[\"']", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string charter = (meta.Groups.Count > ) ? meta.Groups[].Value : string.Empty;
charter = charter.Replace("\"", string.Empty).Replace("'", string.Empty).Replace(";", string.Empty);
if (charter.Length > )
{
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, , 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);
} }

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", "+"));
}
}

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位MD5加密(取32位加密的9~25字符)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(, );
}
if (code == ) //32位加密
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
}
return ""; } /// <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[];
rDel.Key = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length); return Convert.ToBase64String(resultArray, , 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[];
rDel.Key = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray);
} public static string Encrypt2(string toEncrypt)
{
StringBuilder sb = new StringBuilder();
int asc = ;
foreach (char c in toEncrypt)
{
asc = (int)c;
sb.Append(Convert.ToString(asc, ) + "");
} return sb.ToString();
} public static string Decrypt2(string toEncrypt)
{
string[] ss = toEncrypt.Split(new char[] { '' }, StringSplitOptions.RemoveEmptyEntries);
StringBuilder sb = new StringBuilder();
foreach (string s in ss)
{
sb.Append(Convert.ToChar(Convert.ToInt32(s, )).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, , bs.Length);
} return ms.ToArray(); //byte[] res = ms.ToArray(); //ms.Dispose();
//ms.Close();
//return Convert.ToBase64String(res);
} }

中转Http请求的更多相关文章

  1. SpringMvc接口中转设计(策略+模板方法)

    一.前言 最近带着两个兄弟做支付宝小程序后端相关的开发,小程序首页涉及到很多查询的服务.小程序后端服务在我司属于互联网域,相关的查询服务已经在核心域存在了,查询这块所要做的工作就是做接口中转.参考了微 ...

  2. 今天携程出事了:让我们来学习下http的响应码

    就在今天,2015年5月28日,中国最大的旅游机票预订网站--携程网粗大事了.据传携程网的数据库被人物理删除了,而容灾备份的数据又无法正常使用,服务器全面遭受瘫痪.每小时给携程带来的损失约100万美元 ...

  3. openSUSE 国内镜像和镜像使用帮助 (zhuan)

    https://my.oschina.net/u/2475751/blog/631036?p={{currentPage-1}} https://lug.ustc.edu.cn/wiki/mirror ...

  4. 【go】http实验

    实验1:上手篇 package main import ( "net/http" //"fmt" "os" ) func proxyFunc ...

  5. 如何替代即将淘汰的Flash方案?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由MarsBoy发表于云+社区专栏 | 导语 Web技术飞速发展的如今,我们在感受新技术带来的便捷和喜悦的同时,也时常在考虑着一个问题: ...

  6. Q&A to prepare interview of HSBC

    1.How do you keep updating lastest IT knowledge? 1).keep an eye on current project technology evetho ...

  7. HTTP学习记录

    title: HTTP学习记录 toc: true date: 2018-09-21 20:40:48 HTTP协议,HyperText Transfer Protocol,超文本传输协议,是因特网上 ...

  8. HTTP,HTTPS,HTTP2笔记

    HTTP 网络协议分层 应用层 -> HTTP FTP 为应用软件提供了很多服务 构建于TCP协议之上 屏蔽网络传输的相关细节 传输层 -> TCP UDP 向用户提供可靠的端对端的服务( ...

  9. 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知

    前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...

随机推荐

  1. 曲线参数化的Javascript实现(理论篇)

    在关键帧动画的制作过程中,动画师在k物体运动的过程中,一般要确定2个参数: 1)运动轨迹(表示物体运动的路径): 2)速度曲线(表示物体随时间的速度变化). 对于运动轨迹通常选用一定的样条曲线,通过动 ...

  2. JS总结 节点

    nodeName 获取节点名称 元素节点:返回标记名称  属性节点:返回属性名称 文本节点:返回文本#text nodeTyle 获取节点类型 元素节点:返回1 属性节点:返回2 文本节点:返回3 n ...

  3. 我的OpenCV学习笔记:VideoCapture类

    opnCV  学习博客http://blog.csdn.net/thefutureisour/article/details/7472104 1 OpneCV中的数据共享机制 OpenCV是一个很不错 ...

  4. 胡说REST(REpresentational State Transfer)

    Roy T. Fielding的2000年在他的博士论文中提出REpresentational State Transfer这一软件架构风格,相比"表述性状态转移"等等类似的拗口的 ...

  5. mybatis配置文件查询参数的传递

    通常来说,参数传递可以使用#与$进行编写,但是使用#的效率更高,使用$方式,查看日志更方便些,尤其是当执行的sql语句非常麻烦的时候. 1) 接口 形式 以下方式 [传递参数是一个实体] public ...

  6. C#获得网络连接信息 IPGlobalProperties

    IPGlobalProperties 提供有关本地计算机的网络连接的信息. 此类提供有关本地计算机的网络接口和网络连接的配置和统计信息 可以获取本机TCP UDP 丢包 发包等数据. 此类提供的信息与 ...

  7. Ansible-Tower快速入门-5.导入许可【翻译】

    导入许可 Tower需要一个有效的许可才可以正常运行,当你输入你的相关信息得以下载tower时,你应该有接收到一封包含许可的email邮件,你也可以直接从ansible获取许可. 如果你不能获取许可或 ...

  8. 安装和使用Visual Studio 2013并进行简单的单元测试

    现在我正在安装visual studio 2013,我听说好多同学都在安装visual studio 2015,但是他好像只支持Win10吧,我就退而求其次安装了visual studio 2013. ...

  9. jsp编程

     jsp编程 jsp的实质和工作原理 注释 九大内置对象 jsp文件的结构解析 脚本语法 jsp指令 jsp动作元素 EL表达式 jsp的实质和工作原理: jsp (全称:Java Server Pa ...

  10. myeclipse10.7破解成功 但 无法打war包 提示:securecrt alert:integrity ch

    myeclipse10.7破解成功 但 无法打war包  提示:securecrt alert:integrity check error   找了好久才找到解决办法 http://download. ...