Looking for a HTTPHandler to modify pages on the fly to point to a CDN

后端 未结 1 1284
名媛妹妹
名媛妹妹 2021-01-02 17:57

What I\'m trying to do is create (or perhaps one already exists) a HTTPHandler that will filter the HTML generated ASP.NET to use the content delivery network (CDN). For exa

相关标签:
1条回答
  • 2021-01-02 18:29

    You could write a response filter which can be registered in a custom HTTP module and which will modify the generated HTML of all pages running the regex you showed.

    For example:

    public class CdnFilter : MemoryStream
    {
        private readonly Stream _outputStream;
        public CdnFilter(Stream outputStream)
        {
            _outputStream = outputStream;
        }
    
        public override void Write(byte[] buffer, int offset, int count)
        {
            var contentInBuffer = Encoding.UTF8.GetString(buffer);
    
            contentInBuffer = Regex.Replace(
                contentInBuffer, 
                @"href=(['""])(/Portals/.+\.css)",
                m => string.Format("href={0}http://cdn.example.com{1}", m.Groups[1].Value, m.Groups[2].Value)
            );
    
            contentInBuffer = Regex.Replace(
                contentInBuffer,
                @"src=(['""])(/Portals/.+\.(css|gif|jpg|jpeg))",
                m => string.Format("href={0}http://cdn.example.com{1}", m.Groups[1].Value, m.Groups[2].Value)
            );
    
            _outputStream.Write(Encoding.UTF8.GetBytes(contentInBuffer), offset, Encoding.UTF8.GetByteCount(contentInBuffer));
        }
    }
    

    and then write a module:

    public class CdnModule : IHttpModule
    {
        void IHttpModule.Dispose()
        {
        }
    
        void IHttpModule.Init(HttpApplication context)
        {
            context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
        }
    
        void context_ReleaseRequestState(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Filter = new CdnFilter(HttpContext.Current.Response.Filter);
        }
    }
    

    and register in web.config:

    <httpModules>
      <add name="CdnModule" type="MyApp.CdnModule, MyApp"/>
    </httpModules>
    
    0 讨论(0)
提交回复
热议问题