这两天一直再看微信开发,临时在我的电脑搭了个IIS服务器做微信开发,外网也能访问了,关键是,调试太麻烦了!!
我写完代码,要将代码发布到IIS才能接收微信消息,可是在这个过程中,我不知道微信发过来的是什么,出现Bug调试麻烦,
我得 找到是哪里 出现Bug了,修改代码再发布!
有没有办法让我能够像平时那样,设个断点就行了?
于是我就写了一个简易的Http请求转发器
原理是这样:微信先请求我的IIS服务器,IIS服务器通过下面这个module 将请求 转发 到 Vs 的 IIS Express,IIS Express
再返回响应内容到IIs,IIs最后将消息发到微信
看代码:
public class Transformer:IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += context_BeginRequest; } /// <summary> /// 要将Http请求转发 到 的 目标Url /// </summary> public Uri ToUrl { get { //从配置中读取 string toUrl = System.Configuration.ConfigurationManager.AppSettings["TransToURL"]; //判断Url是否/结尾 if (!toUrl.EndsWith("/")) { toUrl = toUrl + "/"; } Uri uri=new Uri(toUrl); return uri; } } /// <summary> /// 目标UrlHost /// </summary> public string ToUrlHost { get { return ToUrl.Host; } } /// <summary> /// 目标Url 的端口 /// </summary> public string ToPort { get { var result = Regex.Match(ToUrl.ToString(), @"^http://.+:(\d+)", RegexOptions.IgnoreCase); if (result.Groups.Count > 1) { return result.Groups[1].Value; } else { return ""; } } } /// <summary> /// 客户端直接请求的Url ,也就是 本 应用程序的 Url ,所有对该Url的请求都会被转发到 目标Url /// </summary> public Uri FromUrl { get; set; } /// <summary> /// 本应用程序Url Host /// </summary> public string FromUrlHost { get { return FromUrl.Host; } } /// <summary> /// 本应用程序Url 端口 /// </summary> public string FromPort { get { var result = Regex.Match(FromUrl.ToString(), @"^http://.+:(\d+)", RegexOptions.IgnoreCase); if (result.Groups.Count > 1) { return result.Groups[1].Value; } else { return ""; } } } void context_BeginRequest(object sender, EventArgs e) { string toUrl = this.ToUrl.ToString(); HttpApplication app = sender as HttpApplication; var respone = app.Response; var request = app.Request; //初始化 本应用程序 Url FromUrl=new Uri(request.Url.ToString()); //获取转换目标后的Url //将请求报文中的 Url 替换为 目标 Url string tempUrl = this.ReplaceHostAndPort(FromUrl.ToString(),TransType.TransTo); //创建 Http 请求 用于将 替换后 请求报文 发往 目标 Url HttpWebRequest hRequest = HttpWebRequest.CreateHttp(tempUrl); //设置请求头 this.SetRequestHead(hRequest, request); #region 设置特殊请求头 if (!string.IsNullOrEmpty(request.Headers["Accept"])) { hRequest.Accept = request.Headers["Accept"]; } if (!string.IsNullOrEmpty(request.Headers["Connection"])) { string connection = request.Headers["Connection"]; hRequest.KeepAlive = string.Compare(connection, "keep-alive", StringComparison.CurrentCultureIgnoreCase) == 0; } if (!string.IsNullOrEmpty(request.Headers["Content-Type"])) { hRequest.ContentType = request.Headers["Content-Type"]; } if (!string.IsNullOrEmpty(request.Headers["Expect"])) { hRequest.Expect = request.Headers["Expect"]; } if (!string.IsNullOrEmpty(request.Headers["Date"])) { hRequest.Date = Convert.ToDateTime(request.Headers["Dat