寻找一个HTTPHandler来动态修改页面以指向CDN

本文关键字:修改 CDN 动态 HTTPHandler 一个 寻找 | 更新日期: 2023-09-27 17:57:16

我正在尝试做的是创建一个HTTPHandler(或者可能已经存在一个),它将过滤HTML生成的 ASP.NET 以使用内容交付网络(CDN)。例如,我想重写如下引用:

/

门户/_default/默认.css

http://cdn.example.com/Portals/_default/default.css

我非常高兴使用正则表达式来匹配初始字符串。这样的正则表达式模式可能是:

href=['"](/Portals/.+'.css)

src=['"](/Portals/.+'.(css|gif|jpg|jpeg))

这是一个dotnetnuke网站,我并不能真正控制所有生成的HTML,所以这就是为什么我想用HTTPHandler来做这件事。这样,更改可以在页面生成后完成。

寻找一个HTTPHandler来动态修改页面以指向CDN

您可以编写一个响应过滤器,该过滤器可以在自定义 HTTP 模块中注册,并将修改运行您显示的正则表达式的所有页面的生成 HTML。

例如:

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));
    }
}

然后编写一个模块:

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);
    }
}

并在 web.config 中注册:

<httpModules>
  <add name="CdnModule" type="MyApp.CdnModule, MyApp"/>
</httpModules>