Kel*_*tex 7 c# asp.net dotnetnuke cdn
我正在尝试做的是创建(或者可能已经存在)一个HTTPHandler,它将过滤HTML生成的ASP.NET以使用内容交付网络(CDN).例如,我想重写这样的引用:
/Portals/_default/default.css
至
我很高兴使用RegEx来匹配初始字符串.这样的正则表达式可能是:
href=['"](/Portals/.+\.css)
Run Code Online (Sandbox Code Playgroud)
要么
src=['"](/Portals/.+\.(css|gif|jpg|jpeg))
Run Code Online (Sandbox Code Playgroud)
这是一个dotnetnuke网站,我实际上并没有控制所有生成的HTML,所以这就是我想用HTTPHandler做的原因.这样,可以在页面生成后完成更改.
Dar*_*rov 13
您可以编写一个响应过滤器,该过滤器可以在自定义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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后写一个模块:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并在web.config中注册:
<httpModules>
<add name="CdnModule" type="MyApp.CdnModule, MyApp"/>
</httpModules>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2396 次 |
| 最近记录: |