中转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 == || 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请求的更多相关文章
- SpringMvc接口中转设计(策略+模板方法)
一.前言 最近带着两个兄弟做支付宝小程序后端相关的开发,小程序首页涉及到很多查询的服务.小程序后端服务在我司属于互联网域,相关的查询服务已经在核心域存在了,查询这块所要做的工作就是做接口中转.参考了微 ...
- 今天携程出事了:让我们来学习下http的响应码
就在今天,2015年5月28日,中国最大的旅游机票预订网站--携程网粗大事了.据传携程网的数据库被人物理删除了,而容灾备份的数据又无法正常使用,服务器全面遭受瘫痪.每小时给携程带来的损失约100万美元 ...
- openSUSE 国内镜像和镜像使用帮助 (zhuan)
https://my.oschina.net/u/2475751/blog/631036?p={{currentPage-1}} https://lug.ustc.edu.cn/wiki/mirror ...
- 【go】http实验
实验1:上手篇 package main import ( "net/http" //"fmt" "os" ) func proxyFunc ...
- 如何替代即将淘汰的Flash方案?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由MarsBoy发表于云+社区专栏 | 导语 Web技术飞速发展的如今,我们在感受新技术带来的便捷和喜悦的同时,也时常在考虑着一个问题: ...
- 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 ...
- HTTP学习记录
title: HTTP学习记录 toc: true date: 2018-09-21 20:40:48 HTTP协议,HyperText Transfer Protocol,超文本传输协议,是因特网上 ...
- HTTP,HTTPS,HTTP2笔记
HTTP 网络协议分层 应用层 -> HTTP FTP 为应用软件提供了很多服务 构建于TCP协议之上 屏蔽网络传输的相关细节 传输层 -> TCP UDP 向用户提供可靠的端对端的服务( ...
- 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知
前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...
随机推荐
- 从UWP到SWIFT - TableBarController 和 Pivot
现在我还不是特别能适应swift中页面做bar的做法,感觉很奇怪. 现在我正在做一个简单的新浪微博,有一个主页,顶部有导航栏,底部是选项卡. 如果用wup来做的话,顶部应该是我们自己写的Usercon ...
- 数据库Mysql学习笔记(一)
Mysql 数据库是数据库初学者最佳的选择的,其语法简单,采用的非底层的SQL语言定义(DDL).操作(DML).控制(DCL)数据库. 入门知识:服务器.库.表. (1)安装Mysql服务器.配置文 ...
- repo upload上传提交时发生remote rejected异常
部分关键异常内容为: ...... remote:ERROR:committer email address %%%%%% remote:ERROR:does not match your user ...
- 黑马程序员——【Java高新技术】——案例:交通灯管理系统
---------- android培训.java培训.期待与您交流! ---------- 一.交通灯管理系统的项目需求 Ø 异步随机生成按照各个路线行驶的车辆 例如: 由南向而来去往北向的车辆 - ...
- 关于zero_interconnect_delay_mode和nonzero_interconnect_delay_mode的区别
在执行report_qor命令时,需要注意这样一个问题,对于Reg_2_Reg路径,在worst scene情况下,nonzero模型要比zero模型报出的结果差,但在best scene情况下,却要 ...
- 数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法
整理数据挖掘的基本概念和算法,包括关联规则挖掘.分类.聚类的常用算法,敬请期待.今天讲的是关联规则挖掘的最基本的知识. 关联规则挖掘在电商.零售.大气物理.生物医学已经有了广泛的应用,本篇文章将介绍一 ...
- Freemark基本语法知识(转)
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...
- c++11新的小猫腻
1.void*指针的使用,平时见得也很多了,至于为什么使用void* 指针,很多人有自己的见解,反正普通指针轻轻松松的转向void * 指针,但是void*指针转向其他的指针都要采用强制转换的. 2. ...
- JS简介
JS是一本广泛应用于浏览器客户端的脚本语言,由netspace公司设计,当时和sun公司合作,所以名字取得像java JS的常见用途:1)HTML DOM操作(节点操作,比如添加.修改.删除节点 ) ...
- vs2010设置断点进行调试时不起作用
1.打开vs2010 2.点击web下的“属性” 3.点击“生成” 4.点击最下方的“高级” 5.在“输出”-调试信息中选择“full”,点击确定按钮即可