2011-07-31 2 views
8

Je dois utiliser CDN pour toutes les images sur mon site. Donc, j'ai décidé d'utiliser IIS Url-réécriture du module, parce que modifier manuellement toutes les vues de mon site - c'est impossible pour moi.Mettre des images sur CDN, en utilisant MVC3 sur IIS7

Ainsi Ive a établi des règles pour IIS, par exemple:

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

Son travaillé, mais comme vous pouvez le voir il y a redirect type est utilisé (301 Permanent). Et je pense que cela affecte les performances du site. Peut-être qu'il est possible d'éditer Request.Output pour remplacer l'URL de l'image?

S'il vous plaît des conseils, comment puis-je utiliser CDN pour les images, ne pas modifier mes vues et éviter les redirections?

Toute aide sera appréciée

Répondre

7

Je suis d'accord avec Steve. Le réécriteur d'URL effectue des redirections 301, mais pour chaque image dont la page a besoin, le navigateur envoie tout d'abord une requête au serveur pour découvrir qu'il est 301 redirigé vers une URL CDN. La seule chose que vous économisez à ce stade est le téléchargement du contenu. Au lieu de cela, vous pouvez simplement mettre en place un filtre de réponse qui modifiera les URL des ressources avant que la réponse ne soit envoyée au navigateur client. De cette façon, le navigateur client n'a jamais à faire des appels à votre serveur pour les actifs statiques:

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

puis le 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 
    } 
} 

Le résultat de ceci est que tous les actifs de contenu qui ressemblent à <img src="\Content\whatever.jpg" /> sera converti en <img src="cdn-url.com\Content\whatever.jpg" />

+0

c'est exactement ce dont j'ai besoin, merci vous et @Steve! – bogert

+0

Puis-je demander, où devrions-nous mettre ce filtre de réponse dans l'application ASP MVC? – DevMania

+0

La classe de filtre de réponse réelle? La classe peut résider n'importe où dans le projet, tant que le contrôleur a accès à la classe. –

1

Étant donné que les URL d'origine proviennent de votre contenu et non, par exemple, de signets, je pense que vous aurez du mal à éviter une demande à votre site et une redirection; un impact sur les performances potentiellement significatif qui pourrait annuler les avantages de l'utilisation d'un CDN.

Il serait préférable que votre pourrait appliquer la réécriture d'URL au code HTML qui est transmis au navigateur, plutôt que lorsqu'une demande arrive.

Le problème est, je ne sais pas comment (sauf si vous êtes en utilisant le serveur ISA, auquel cas je pourrais vous le dire, mais je suppose que vous ne l'êtes pas!)

Vous pouvez créer un filtre ActionFilter personnalisé et remplacer OnResultExecuted, mais vous devez annoter votre contrôleur avec l'attribut filter.

+0

En ce qui concerne OnResultExecuted: est-il possible d'éditer outgouing html? Ne peut pas le comprendre et google ne veux pas m'aider – bogert

+0

@ Mike a ce que je pêchais - c'est un filtre de réponse ASP.NET que nous voulons, pas un MVC un ... –

Questions connexes