国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一個簡易的Http請求轉發器

2019-11-14 16:02:11
字體:
來源:轉載
供稿:網友

這兩天一直再看微信開發,臨時在我的電腦搭了個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["Date"]);            }            if (!string.IsNullOrEmpty(request.Headers["Host"]))            {                hRequest.Host = this.ToUrlHost;            }            if (!string.IsNullOrEmpty(request.Headers["If-Modified-Since"]))            {                hRequest.IfModifiedSince =Convert.ToDateTime( request.Headers["If-Modified-Since"]);            }            if (!string.IsNullOrEmpty(request.Headers["Referer"]))            {                hRequest.Referer = this.ReplaceHostAndPort(request.Headers["Referer"],TransType.TransTo);            }            if (!string.IsNullOrEmpty(request.Headers["User-Agent"]))            {                hRequest.UserAgent = request.Headers["User-Agent"];            }            if (!string.IsNullOrEmpty(request.Headers["Content-Length"]))            {                hRequest.ContentLength =Convert.ToInt32( request.Headers["Content-Length"]);            }            #endregion            //判斷是否是Get請求,如果不是Get就寫入請求報文體            if (String.Compare(request.HttpMethod, "get", StringComparison.CurrentCultureIgnoreCase) != 0)            {                //設置請求體                this.SetRequestBody(hRequest, request);            }            //獲取響應報文            WebResponse hRespone=null;            try            {               hRespone= hRequest.GetResponse();            }            catch (Exception exp)            {                respone.Write(exp.Message);                respone.End();            }                        //設置響應頭            this.SetResponeHead(hRespone, respone);            #region 設置特殊響應頭            if (!string.IsNullOrEmpty(hRespone.Headers["Content-Type"]))            {                respone.ContentType = hRespone.Headers["Content-Type"];            }            if (!string.IsNullOrEmpty(hRespone.Headers["Host"]))            {                respone.AddHeader("Host", FromUrlHost);             }            if (!string.IsNullOrEmpty(hRespone.Headers["Referer"]))            {                respone.AddHeader("Referer",this.ReplaceHostAndPort(hRespone.Headers["Referer"], TransType.TransBack));             }            #endregion            //寫入響應內容            this.SetResponeBody(hRespone,respone);            respone.End();        }        /// <summary>        /// 設置請求頭        /// </summary>        /// <param name="nrq"></param>        /// <param name="orq"></param>        private void SetRequestHead(WebRequest nrq, HttpRequest orq)        {            foreach (var key in orq.Headers.AllKeys)            {                try                {                    nrq.Headers.Add(key, orq.Headers[key]);                }                catch (Exception)                {                                        continue;                }                            }        }        /// <summary>        /// 設置請求 報文體        /// </summary>        /// <param name="nrq"></param>        /// <param name="orq"></param>        private void SetRequestBody(WebRequest nrq, HttpRequest orq)        {            nrq.Method = "POST";            var nStream = nrq.GetRequestStream();            byte[] buffer = new byte[1024 * 2];            int rLength = 0;            do            {                rLength = orq.InputStream.Read(buffer, 0, buffer.Length);                nStream.Write(buffer, 0, rLength);            } while (rLength > 0);        }        /// <summary>        /// 設置響應頭        /// </summary>        /// <param name="nrp"></param>        /// <param name="orp"></param>        private void SetResponeHead(WebResponse nrp, HttpResponse orp)        {            foreach (var key in nrp.Headers.AllKeys)            {                try                {                    orp.Headers.Add(key, nrp.Headers[key]);                }                catch (Exception)                {                                        continue;                }                           }        }        /// <summary>        /// 設置響應報文體        /// </summary>        /// <param name="nrp"></param>        /// <param name="orp"></param>        private void SetResponeBody(WebResponse nrp, HttpResponse orp)        {            var nStream = nrp.GetResponseStream();            byte[] buffer = new byte[1024 * 2];            int rLength = 0;            do            {                rLength = nStream.Read(buffer, 0, buffer.Length);                orp.OutputStream.Write(buffer, 0, rLength);            } while (rLength > 0);        }        /// <summary>        /// 替換 Host和Port        /// </summary>        /// <param name="url"></param>        /// <param name="type"></param>        /// <returns></returns>        private string ReplaceHostAndPort(string url, TransType type)        {            string tempToPortStr = string.IsNullOrEmpty(ToPort) ? "" : ":" + ToPort;            string tempFromPortStr = string.IsNullOrEmpty(FromPort) ? "" : ":" + FromPort;            if (type==TransType.TransBack)            {                return url.Replace(ToUrlHost + tempToPortStr, FromUrlHost + tempFromPortStr);            }            else            {                return url.Replace(FromUrlHost + tempFromPortStr, ToUrlHost + tempToPortStr);            }        }    }    public enum TransType    {        TransTo,        TransBack    }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淮南市| 商都县| 罗平县| 宜城市| 特克斯县| 西乌珠穆沁旗| 清水县| 平邑县| 神农架林区| 德保县| 青阳县| 酒泉市| 南开区| 桦南县| 泰来县| 荣成市| 湘乡市| 枣强县| 仲巴县| 北流市| 松滋市| 北辰区| 许昌市| 佛山市| 锡林浩特市| 微博| 郴州市| 突泉县| 锦州市| 宁阳县| 元谋县| 绥棱县| 浦江县| 景泰县| 枣庄市| 安溪县| 景德镇市| 菏泽市| 墨竹工卡县| 策勒县| 曲阜市|