This is something i have created to change the image urls at runtime to point those url at some CDN server instead of my own server.
What i have done is simply intercept the a page if it ends with .aspx and them apply filter using my own created stream that will check the html markup and replace image url to CDN url.
ASPX Code:
 
 or even you can use ![]()
 
 
HttpModule Code: 
  
public class CDNImageModule : IHttpModule
    {
        public void Dispose()
        {
        }
        public void Init(HttpApplication context)
        {
                context.BeginRequest += (o, e) =>
                {
                    if (context.Request.RawUrl.EndsWith(".aspx"))
                    {
                        var _watcher = new StreamWatcher(context.Response.Filter);
                        context.Response.Filter = _watcher;
                    }
                };
        }
    }
    public class StreamWatcher : Stream
    {
        public StreamWatcher(Stream sink)
        {
            _sink = sink;
        }
        private Stream _sink;
        #region Properites
        public override bool CanRead
        {
            get { return true; }
        }
        public override bool CanSeek
        {
            get { return true; }
        }
        public override bool CanWrite
        {
            get { return true; }
        }
        public override void Flush()
        {
            _sink.Flush();
        }
        public override long Length
        {
            get { return 0; }
        }
        private long _position;
        public override long Position
        {
            get { return _position; }
            set { _position = value; }
        }
        #endregion
        #region Methods
        public override int Read(byte[] buffer, int offset, int count)
        {
            return _sink.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return _sink.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            _sink.SetLength(value);
        }
        public override void Close()
        {
            _sink.Close();
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            byte[] data = new byte[count];
            Buffer.BlockCopy(buffer, offset, data, 0, count);
            string html = System.Text.Encoding.Default.GetString(buffer);
            TransformString(ref html);
            byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
            _sink.Write(outdata, 0, outdata.GetLength(0));
        }
        #endregion
        void TransformString(ref string input)
        {
            string regExPatternForImgTags = "![]() ]* src=\\\"([^\\\"]*)\\\"[^>]*>"; //this will match all the
]* src=\\\"([^\\\"]*)\\\"[^>]*>"; //this will match all the ![]() tags with src attribute, you may need to extend this. 
            MatchEvaluator evaluator = new MatchEvaluator(RewriteImageSrc);
            input = Regex.Replace(input, regExPatternForImgTags, evaluator);
        }
        public static string RewriteImageSrc(Match match)
        {
            return match.Value.Replace("src=\"", "src=\"http://img.mydomain.com/");
        }
 tags with src attribute, you may need to extend this. 
            MatchEvaluator evaluator = new MatchEvaluator(RewriteImageSrc);
            input = Regex.Replace(input, regExPatternForImgTags, evaluator);
        }
        public static string RewriteImageSrc(Match match)
        {
            return match.Value.Replace("src=\"", "src=\"http://img.mydomain.com/");
        }
} 
 
 
1 comment:
Thanks a lot.... this is what i was looking for. You saved me
Post a Comment