我需要对我网站上的所有图片使用CDN。 所以,我决定使用IIS Url重写模块, 因为手动编辑我的所有网站视图 - 这对我来说是不可能的。
所以我为IIS制定了规则,例如:
<rule name="cdn1" stopProcessing="true">
<match url="^Content/Images.*/(.*\.(png|jpeg|jpg|gif))$" />
<action
type="Redirect"
url="http://c200001.r9.cf1.rackcdn.com/{ToLower:{R:1}}"
redirectType="Permanent" />
</rule>
它有效,但正如您所看到的那样,使用了重定向类型(301 Permanent)。 我认为它会影响网站性能。 也许可以编辑 Request.Output 来替换图片网址?
请告知,我如何使用CDN图片,不要编辑我的观点并避免重定向?
任何帮助将不胜感激
答案 0 :(得分:7)
我同意史蒂夫。您有URL重写器执行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)
{
//However the Url should be replaced
}
}
结果是,所有看似<img src="\Content\whatever.jpg" />
的内容资产都将转换为<img src="cdn-url.com\Content\whatever.jpg" />
答案 1 :(得分:1)
鉴于原始网址来自您的内容,而不是来自书签,我认为您无法避免向您的网站发送请求和重定向;潜在的重大性能影响可能会抵消使用CDN带来的好处。
如果您可以将URL重写应用于传输到浏览器的HTML,而不是在请求进入时,那会更好。
麻烦的是,我不知道如何(除非你使用ISA服务器,在这种情况下我可以告诉你,但我怀疑你不是)!
您可以创建自定义ActionFilter并覆盖OnResultExecuted,但您需要使用filter属性为控制器添加注释。