2010-01-05 5 views
5

Je me demande s'il existe un moyen facile de spécifier un CDN pour tout le contenu que je référence via Url.Content dans mes vues.asp.net MVC Url.Content() Redirection CDN

Quelque chose que je pourrais configurer dans mon fichier Web.config d'une manière similaire à ce qui suit.

 
    <cdn> 
     <add filetype="css" root="http://mycdn.mydomain.com/stylesheets/" /> 
     <add filetype="js" root="http://myjscdn.mydomain.com/js/ /> 
    </cdn> 

Ensuite, je pouvais avoir <% = Url.Content ("~/Contenu/StyleSheets/What.css")%> et génèrerait http://mycdn.mydomain.com/stylesheets/Content/StyleSheets/What.css.

Si rien n'est disponible, je vais le faire moi-même via des méthodes d'extension, mais je me demandais si c'était possible hors de la boîte.

Répondre

9

La réponse ci-dessus est probablement correcte, voici comment il pourrait regarder dans la pratique:

// @ UrlHelperExtensions.cs 

public static class UrlHelperExtensions 
{ 
    public static string CdnContent(this UrlHelper helper, string contentPath) 
    { 
     return (ConfigurationManager.AppSettings["CDN_Available"] == "True") 
       ? ConfigurationManager.AppSettings["CDN_ContentRootUrl"] 
        + contentPath.TrimStart('~') 
       : helper.Content(contentPath); 
} 

// @ Web.config 

<appSettings> 
    // ... 
    <add key="CDN_Available" value="True" /> 
    <add key="CDN_SiteImageRoot" value="http://cdn.gbase.com/images/" /> 
    // ... 
</appSettings> 

// @ MyPage.cs 

<link href="@Url.CdnContent("~/client/css/mymin.css")" rel="stylesheet" type="text/css" media="all" /> 

Je pense que les travaux .. Vous pouvez également utiliser plusieurs méthodes d'extension pour séparer les sortes de contenu pour servir localement et ceux sur le CDN .. Il n'y a aucune exigence que la configuration soit dans web.config, juste utile pour le développement et la gestion.

+0

C'est ce que j'ai fini par faire, mais avec une collection de nom-valeur personnalisée pour mapper des extensions à différents domaines, puisque les images n'étaient pas sur le même domaine que le CSS. –

+0

J'utilise un modèle de fonction-thunk pour faire la vérification de la configuration se produire une fois comme: chaîne statique privée CDNDomain = ConfigurationManager.AppSettings ["CDNDomain"]; private static Func thunk = DetectCDN; chaîne statique privé DetectCDN (UrlHelper urlHelper, le chemin de chaîne) {if (String.IsNullOrEmpty (CDNDomain)) thunk = (u, p) => {return u.Content (p); } sinon thunk = (u, p) => {return CDNDomain + p.TrimStart ('~'); } // nous devons gérer celui-ci nous sommes hors de la boucle à l'avenir retour thunk (urlHelper, chemin) } – IDisposable

0

Je ne crois pas qu'il y ait quelque chose de intégré pour faciliter cela pour vous. Cela dit, ajouter ceci à Web.config est-il vraiment nécessaire? Je suppose que si vous ne voulez pas inclure vos articles distribués sur CDN sur chaque page de votre application, je pourrais comprendre l'extrapolation des URL à un emplacement central quelque part, mais même alors, il semble que vous pourriez écrire une extension méthodes qui retournent une chaîne constante au lieu de jouer avec Web.config. Je sais que certaines personnes grincent des dents parce que vous devez recompiler pour changer les URL, mais à quelle fréquence vont-elles changer?

Dans le cas, toutefois, que vous souhaitiez inclure ces éléments distribués CDN sur chaque page, qu'y a-t-il de mal à jeter les URL dans votre page maître? Dans la plupart des cas, la modification de votre page maître est aussi simple que la modification d'une valeur web.config.

+0

J'aime juste avoir ma configuration dans mon fichier web.config. C'est plus facile à repérer et plus facile à lire que le code. Et ce n'est pas seulement pour les fichiers qui sont inclus dans mes pages maîtres, j'ai beaucoup de petits fichiers javascript que j'inclus dans plusieurs pages et je ne veux pas oublier l'un d'entre eux. –

+0

Il est logique de configurer certaines choses, je voulais seulement que vous y pensiez. Je suis venu dans des projets trop souvent qui ont littéralement 150 "toggle" drapeaux et différentes valeurs dans le web.config, et les choses finissent par se dupliquer parce que les gens oublient ce qu'ils ont fait là-bas :) –

+0

Je comprends totalement cela. Ça arrive aussi. Je pense juste que c'est pratique, comme si je décidais d'ajouter un CDN pour swf seulement plus tard, je vais juste devoir ajouter l'élément avec les bonnes valeurs et je suis prêt. Sinon, je devrais changer tous mes appels aux méthodes et ainsi de suite. Merci pour la contribution. –

Questions connexes