2010-01-05 26 views
5

Me pregunto si hay una manera fácil de especificar un CDN para todo el contenido al que hago referencia a través de Url.Content en mis vistas.asp.net MVC Url.Content() redirección de CDN

Algo que podría configurar en mi archivo Web.config de una manera similar a la siguiente.

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

Entonces, tan sólo pudiera tener <% = Url.Content ("~/contenido/hojas de estilo/What.css")%> y sería http://mycdn.mydomain.com/stylesheets/Content/StyleSheets/What.css de salida.

Si no hay nada disponible, solo lo haré yo mismo a través de los métodos de extensión, pero me preguntaba si era posible de inmediato.

Respuesta

9

La respuesta anterior es probablemente correcta, aquí es cómo se vería en la práctica:

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

Creo que las obras .. También se pueden utilizar varios métodos de extensión para segregar clase de contenidos para servir localmente y aquellos en el CDN ... No hay ningún requisito de que la configuración esté en web.config, solo es útil para el desarrollo y la administración.

+0

Eso es lo que terminé haciendo, pero con una colección de nombre-valor personalizada para asignar extensiones a diferentes dominios, ya que las imágenes no estaban en el mismo dominio que el CSS. –

+0

Uso un patrón de función de procesador para hacer que la comprobación de configuración se realice una vez como: cadena privada estática CDNDomain = ConfigurationManager.AppSettings ["CDNDomain"]; privada estática Func thunk = DetectCDN; cadena estática privada DetectCDN (UrlHelper UrlHelper, string path) { si (String.IsNullOrEmpty (CDNDomain)) golpe seco = (u, p) => {return u.Content (p); }; else thunk = (u, p) => {return CDNDomain + p.TrimStart ('~'); }; // tenemos que manejar este que estamos fuera de ciclo en el futuro return thunk (urlHelper, ruta) } – IDisposable

0

No creo que haya nada incorporado para facilitar esto. Dicho esto, ¿agregar esto a Web.config es realmente necesario?

Supongo que si no desea incluir sus elementos distribuidos por CDN en cada página de su aplicación, podría entender la extrapolación de las URL a una ubicación central en alguna parte, pero aun así parece que podría simplemente escribir alguna extensión métodos que devuelven una cadena constante en lugar de jugar con Web.config. Sé que algunas personas se avergüenzan de esto porque tienes que recompilar para cambiar las URL, pero ¿con qué frecuencia van a cambiar?

En el caso, sin embargo, que desee incluir estos elementos distribuidos por CDN en cada página, ¿qué hay de malo en arrojar las URL en su página maestra? En la mayoría de los casos, cambiar su página maestra es tan simple como cambiar un valor web.config.

+0

Solo me gusta tener mi configuración en mi archivo web.config. Es más fácil de detectar y más fácil de leer que el código. Y no es solo para los archivos que se incluyen en mis páginas maestras, tengo muchos archivos JavaScript más pequeños que incluyo en varias páginas y no quiero olvidar ninguno de ellos. –

+0

Tiene sentido configurar algunas cosas, solo quise que pensaras en ello. He entrado en proyectos con demasiada frecuencia que tienen literalmente 150 "alternar" banderas y varios valores en el web.config, y cosas realmente terminan siendo duplicadas porque la gente olvida lo que han hecho allí :) –

+0

Lo entiendo totalmente. Sucede aquí también Solo creo que es práctico, como si decidiera agregar un CDN para swf solo más adelante, solo tendré que agregar el elemento con los valores correctos y estoy listo. De lo contrario, tendría que cambiar todas mis llamadas a métodos y demás. Gracias por el aporte. –

Cuestiones relacionadas