设为首页 加入收藏

TOP

一个简易的Http请求转发器(一)
2019-09-03 01:20:38 】 浏览:33
Tags:一个 简易 Http 请求 转发器

这两天一直再看微信开发,临时在我的电脑搭了个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
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇.NET逻辑分层架构总结 下一篇c#编程:输入、输出

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目