2011-07-31 13 views
8

पर एमवीसी 3 का उपयोग करके सीडीएन पर छवियां डालें, मुझे अपनी साइट पर सभी छवियों के लिए सीडीएन का उपयोग करने की आवश्यकता है। तो, मैंने आईआईएस यूआरएल-रीराइटिंग मॉड्यूल, का उपयोग करने का निर्णय लिया क्योंकि मैन्युअल रूप से मेरे सभी साइट दृश्यों को संपादित करें - यह मेरे लिए असंभव है।आईआईएस 7

तो Ive आईआईएस के लिए नियम बनाया है, उदाहरण के लिए:

<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 स्थायी)। और मुझे लगता है कि यह साइट प्रदर्शन को प्रभावित करता है। शायद छवि URL को प्रतिस्थापित करने के लिए Request.Output संपादित करना संभव है?

कृपया सलाह दें, मैं छवियों के लिए सीडीएन का उपयोग कैसे कर सकता हूं, मेरे विचारों को संपादित नहीं कर सकता और रीडायरेक्ट से बच सकता हूं?

किसी भी मदद

उत्तर

7

मैं स्टीव से सहमत हूं। आपके पास यूआरएल रीराइटर 301 रीडायरेक्ट कर रहा है, लेकिन पेज की हर छवि के लिए, ब्राउज़र अभी भी सर्वर से अनुरोध करता है कि यह पता चलता है कि यह 301 सीडीएन यूआरएल पर रीडायरेक्ट किया गया है। इस बिंदु पर आप सहेज रहे एकमात्र चीज सामग्री डाउनलोड कर रहे हैं।

ऐसा करने के बजाय, आप केवल एक प्रतिक्रिया फ़िल्टर डाल सकते हैं जो ग्राहक ब्राउज़र पर प्रतिक्रिया भेजने से पहले संपत्ति के यूआरएल को संशोधित करेगा।

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

+0

यह वही है जो मुझे चाहिए, धन्यवाद आप और @ स्टेव! – bogert

+0

क्या मैं पूछ सकता हूं, हम एएसपी एमवीसी आवेदन में इस प्रतिक्रिया फ़िल्टर को कहां रखना चाहिए? – DevMania

+0

वास्तविक प्रतिक्रिया फ़िल्टर वर्ग? कक्षा प्रोजेक्ट में कहीं भी रह सकती है, जब तक कि नियंत्रक के पास कक्षा तक पहुंच हो। –

1

यह देखते हुए कि मूल यूआरएल अपनी सामग्री से आ रहे हैं और नहीं, उदाहरण के लिए, बुकमार्क से, मुझे लगता है कि अगर आपको अपनी साइट और एक रीडायरेक्ट करने के अनुरोध से परहेज करना होगा की सराहना की जाएगी; एक संभावित महत्वपूर्ण प्रदर्शन प्रभाव जो सीडीएन का उपयोग करने के लाभों को अस्वीकार कर सकता है।

यह बेहतर होगा कि अपने HTML कि बजाय जब एक अनुरोध में आता ब्राउज़र को प्रेषित किया जाता है, के लिए पुनर्लेखन यूआरएल लागू हो सकते हैं।

मुसीबत, है मैं नहीं जानता कि आप कैसे (कर रहे हैं जब तक आईएसए सर्वर का उपयोग करके, इस मामले में मैं आपको बता सकता हूं, लेकिन मुझे संदेह है कि आप नहीं हैं)!

आप एक कस्टम एक्शनफ़िल्टर बना सकते हैं और ऑनरसेट एक्स्ट्राक्टेड ओवरराइड कर सकते हैं, लेकिन आपको फ़िल्टर नियंत्रक के साथ अपने नियंत्रक को एनोटेट करना होगा।

+0

ऑनरसल्ट के संबंध में परिवर्तित किया जाएगा: क्या HTML को आउटगोइंग करना संभव है? इसे समझ नहीं सकते हैं और Google मेरी मदद नहीं करना चाहते हैं – bogert

+0

@ माइक के पास जो मैं मछली पकड़ रहा था उसे मिला - यह एक एएसपी.NET प्रतिक्रिया फ़िल्टर जिसे हम चाहते हैं, एक एमवीसी नहीं ... –