我同意Steve的观点。你使用URL重写器进行301重定向,但是对于页面所需的每个图像,浏览器仍然首先向服务器发出请求,以发现它被301重定向到CDN Url。此时你只能节省下载内容。
相反,你可以设置一个响应过滤器,在将响应发送到客户端浏览器之前修改资产的URL。这样,客户端浏览器就不必为静态资源向您的服务器发出任何调用:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.Filter = new CdnResponseFilter(filterContext.RequestContext.HttpContext.Response.Filter);
}
接下来是CdnResponseFilter:
public class CdnResponseFilter : MemoryStream
{
private Stream Stream { get; set; }
public CdnResponseFilter(Stream stream)
{
Stream = stream;
}
public override void Write(byte[] buffer, int offset, int count)
{
var data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
string html = Encoding.Default.GetString(buffer);
html = Regex.Replace(html, "src=\"/Content/([^\"]+)\"", FixUrl, RegexOptions.IgnoreCase);
html = Regex.Replace(html, "href=\"/Content/([^\"]+)\"", FixUrl, RegexOptions.IgnoreCase);
byte[] outData = Encoding.Default.GetBytes(html);
Stream.Write(outData, 0, outData.GetLength(0));
}
private static string FixUrl(Match match)
{
}
}
这将导致所有类似于
<img src="\Content\whatever.jpg" />
的内容资产都会被转换为
<img src="cdn-url.com\Content\whatever.jpg" />
。