2011-07-31 28 views
8

Tôi cần sử dụng CDN cho tất cả hình ảnh trên trang web của mình. Vì vậy, Ive đã quyết định sử dụng mô-đun viết lại Url IIS, vì chỉnh sửa thủ công tất cả các lượt xem trang web của tôi - không thể cho tôi.Đặt hình ảnh trên CDN, sử dụng MVC3 trên IIS7

Vì vậy, Ive đã quy định cho IIS, ví dụ:

<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> 

của nó làm việc, nhưng khi bạn có thể thấy có chuyển hướng loại được sử dụng (301 vĩnh viễn). Và tôi nghĩ rằng nó ảnh hưởng đến hiệu suất trang web. Có thể chỉnh sửa Request.Output để thay thế URL hình ảnh?

Vui lòng tư vấn, làm cách nào để sử dụng CDN cho hình ảnh, không chỉnh sửa chế độ xem của tôi và tránh chuyển hướng?

Bất kỳ trợ giúp sẽ được đánh giá cao

Trả lời

7

Tôi đồng ý với Steve. Bạn có trình ghi URL thực hiện chuyển hướng 301, nhưng đối với mọi hình ảnh mà trang cần, trình duyệt vẫn thực hiện yêu cầu tới máy chủ trước tiên để phát hiện ra rằng nó chuyển hướng 301 đến Url CDN. Điều duy nhất bạn đang tiết kiệm tại thời điểm này là tải xuống nội dung.

Thay vì làm điều đó, bạn chỉ cần đặt bộ lọc phản hồi vào vị trí sẽ sửa đổi URL của nội dung trước khi Phản hồi được gửi tới trình duyệt của khách hàng. Bằng cách đó, trình duyệt khách hàng không bao giờ phải thực hiện bất kỳ cuộc gọi đến máy chủ của bạn đối với tài sản tĩnh:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    filterContext.RequestContext.HttpContext.Response.Filter = new CdnResponseFilter(filterContext.RequestContext.HttpContext.Response.Filter); 
} 

Và sau đó 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 
    } 
} 

Kết quả của việc này là tất cả các tài sản nội dung mà hình như <img src="\Content\whatever.jpg" /> sẽ được chuyển đổi thành <img src="cdn-url.com\Content\whatever.jpg" />

+0

đây là chính xác những gì tôi cần, cảm ơn bạn và @Steve! – bogert

+0

Tôi có thể hỏi, chúng ta nên đặt bộ lọc phản hồi này vào ứng dụng ASP MVC ở đâu? – DevMania

+0

Lớp Bộ lọc đáp ứng thực tế? Lớp này có thể nằm ở bất kỳ đâu trong dự án, miễn là bộ điều khiển có quyền truy cập vào lớp đó. –

1

Cho rằng các URL gốc đến từ nội dung của bạn và không, ví dụ, từ bookmark, tôi nghĩ rằng bạn sẽ gặp khó khăn khi tránh một yêu cầu đến trang web của bạn và chuyển hướng; tác động hiệu suất có khả năng đáng kể có thể phủ nhận lợi ích của việc sử dụng CDN.

Sẽ tốt hơn nếu bạn có thể áp dụng URL viết lại để các HTML được chuyển đến trình duyệt, chứ không phải là khi có một request đến.

Vấn đề là, tôi không biết làm thế nào (trừ khi bạn sử dụng máy chủ ISA, trong trường hợp này tôi có thể cho bạn biết, nhưng tôi nghi ngờ bạn không)!

Bạn có thể tạo ActionFilter tùy chỉnh và ghi đè OnResultExecuted, nhưng bạn cần phải chú thích bộ điều khiển của bạn với thuộc tính bộ lọc.

+0

Liên quan đến OnResultExecuted: có thể chỉnh sửa quá nhiều html không? Không thể tìm ra và google không muốn giúp tôi – bogert

+0

@ Mike đã có những gì tôi đã đánh cá cho nó - nó một ASP.NET Response Filter chúng tôi muốn, không phải là một MVC ... –

Các vấn đề liên quan