C#代碼,功能為攔截http請求,並篡改其中任何內容

來源:互聯網
上載者:User
可以對http最終輸出內容做任意的替換,代碼如下:

using System;
using System.Collections;
using System.Configuration;
using System.Text.RegularExpressions;
using System.Web;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;

namespace Cnlamar.Web.HttpModule
{
    public class TextReplace : IHttpModule
    {

        public virtual void Dispose()
        {
        }

        public virtual void Init(HttpApplication context)
        {
            context.ReleaseRequestState += new EventHandler(this.context_ReleaseRequestState);
        }

        public void context_ReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication httpApplication = (HttpApplication)sender;
            if (httpApplication.Response.ContentType.ToLower().IndexOf("image") <= -1)
            {
                TextReplaceFilter textReplaceFilter = new TextReplaceFilter(httpApplication.Response.Filter);
                textReplaceFilter.Encoding = System.Text.Encoding.GetEncoding(httpApplication.Response.ContentEncoding.BodyName);
                textReplaceFilter.ReplaceRules = TextReplaceConfiguration.GetConfig().Rules;
                httpApplication.Response.Filter = textReplaceFilter;
            }
        }
    }

    class TextReplaceFilter : Stream
    {
        public bool IsRestore = false;

        private Stream m_stream;

        private long m_position;

        private TextReplaceRulesCollection _ReplaceRules;

        

        public TextReplaceRulesCollection ReplaceRules
        {
            get
            {
                return _ReplaceRules;
            }

            set
            {
                _ReplaceRules = value;
            }
        }

        public Encoding Encoding
        {
            get
            {
                return _Encoding;
            }

            set
            {
                _Encoding = value;
            }
        }
        private Encoding _Encoding = Encoding.UTF8;

        public override bool CanRead
        {
            get
            {
                return true;
            }
        }

        public override bool CanSeek
        {
            get
            {
                return false;
            }
        }

        public override bool CanWrite
        {
            get
            {
                return false;
            }
        }

        public override long Length
        {
            get
            {
                return 0;
            }
        }

        public override long Position
        {
            get
            {
                return m_position;
            }

            set
            {
                m_position = value;
            }
        }

        public TextReplaceFilter(Stream InputStream)
        {
            m_stream = InputStream;
        }

        public override long Seek(long offset, SeekOrigin direction)
        {
            return 0;
        }

        public override void SetLength(long length)
        {
            m_stream.SetLength(length);
        }

        public override void Close()
        {
            m_stream.Close();
        }

        public override void Flush()
        {
            m_stream.Flush();
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return m_stream.Read(buffer, offset, count);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            string str = Encoding.GetString(buffer, offset, count);
            IEnumerator iEnumerator = ReplaceRules.GetEnumerator();
            try
            {
                while (iEnumerator.MoveNext())
                {
                    TextReplaceRules textReplaceRules = (TextReplaceRules)iEnumerator.Current;
                    str = str.Replace(textReplaceRules.OriginText, textReplaceRules.ResultText);
                }
            }
            finally
            {
                IDisposable iDisposable = iEnumerator as IDisposable;
                if (iDisposable != null)
                {
                    iDisposable.Dispose();
                }
            }
            byte[] bs = Encoding.GetBytes(str);
            m_stream.Write(bs, offset, (int)bs.Length);
        }
    }

    #region Config
    public class TextReplaceRules
    {
        private string _OriginText;

        private string _ResultText;

        public string OriginText
        {
            get
            {
                return _OriginText;
            }

            set
            {
                _OriginText = value;
            }
        }

        public string ResultText
        {
            get
            {
                return _ResultText;
            }

            set
            {
                _ResultText = value;
            }
        }
    }

    [SerializableAttribute()]
    public class TextReplaceRulesCollection : CollectionBase
    {

        public TextReplaceRules this[int index]
        {
            get
            {
                return (TextReplaceRules)base.InnerList[index];
            }

            set
            {
                base.InnerList[index] = value;
            }
        }

        public virtual void Add(TextReplaceRules r)
        {
            base.InnerList.Add(r);
        }
    }

    [XmlRootAttribute("TextReplaceConfig")]
    [SerializableAttribute()]
    public class TextReplaceConfiguration
    {
        private TextReplaceRulesCollection rules;

        public TextReplaceRulesCollection Rules
        {
            get
            {
                return rules;
            }

            set
            {
                rules = value;
            }
        }

        public static TextReplaceConfiguration GetConfig()
        {
            if (HttpContext.Current.Cache["TextReplaceConfig"] == null)
            {
                TextReplaceConfiguration textReplaceConfiguration1 = (TextReplaceConfiguration)ConfigurationSettings.GetConfig("TextReplaceConfig");
                HttpContext.Current.Cache.Insert("TextReplaceConfig", ConfigurationSettings.GetConfig("TextReplaceConfig"));
            }
            TextReplaceConfiguration textReplaceConfiguration2 = (TextReplaceConfiguration)HttpContext.Current.Cache["TextReplaceConfig"];
            return textReplaceConfiguration2;
        }
    }

    public class TextReplaceSerializerSectionHandler : IConfigurationSectionHandler
    {

        public virtual object Create(object parent, object configContext, XmlNode section)
        {
            return new XmlSerializer(typeof(TextReplaceConfiguration)).Deserialize(new XmlNodeReader(section));
        }
    }
    #endregion
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.