2010-01-05 5 views
5

Ich frage mich, ob es eine einfache Möglichkeit gibt, ein CDN für alle Inhalte anzugeben, die ich durch Url.Content in meinen Ansichten referenziere.asp.net MVC Url.Content() CDN-Umleitung

Etwas, das ich in meiner Web.config-Datei in einer ähnlichen Weise wie folgt konfigurieren konnte.

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

Dann könnte, ich habe nur <% = Url.Content ("~/Content/Stylesheets/What.css")%> und es ausgeben würde http://mycdn.mydomain.com/stylesheets/Content/StyleSheets/What.css.

Wenn nichts verfügbar ist, mache ich es einfach per Erweiterungsmethoden, aber ich frage mich, ob es möglich war, aus der Box.

Antwort

9

Die Antwort oben ist wahrscheinlich richtig, hier ist, wie es in der Praxis aussehen könnte:

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

Ich denke, das funktioniert .. Sie können auch mehrere Erweiterungsmethoden verwenden können Arten von Inhalten zu trennen vor Ort zu bedienen und diejenigen, auf der CDN .. Es ist nicht erforderlich, dass die Konfiguration in web.config ist, nur nützlich für die Entwicklung und Verwaltung.

+0

Das ist, was ich getan habe, aber mit einer benutzerdefinierten Name-Wert-Sammlung, um Erweiterungen zu verschiedenen Domänen zuzuordnen, da Bilder nicht auf der gleichen Domäne wie das CSS waren. –

+0

Ich benutze ein Funktion-Thunk-Muster, um die Konfigurationsprüfung passieren einmal wie: private statische Zeichenfolge CDNDomain = ConfigurationManager.AppSettings ["CDNDomain"]; private statische Func thunk = DetectCDN; private static String DetectCDN (UrlHelper UrlHelper, string path) { if (String.IsNullOrEmpty (CDNDomain)) Thunk = (u, p) => {return u.Content (P); }; sonst thunk = (u, p) => {return CDNDomain + p.TrimStart ('~'); }; // wir müssen damit umgehen, wir sind aus der Schleife vorwärts Rückkehr thunk (urlHelper, Pfad) } – IDisposable

0

Ich glaube nicht, dass etwas eingebaut ist, um dies für Sie zu erleichtern. Das heißt, ist das Hinzufügen zu Web.config wirklich notwendig?

Ich denke, wenn Sie Ihre CDN-verteilten Elemente nicht auf jeder Seite in Ihrer Anwendung einschließen möchten, könnte ich die URLs an einen zentralen Speicherort extrapolieren, aber selbst dann scheint es, als ob Sie einfach eine Erweiterung schreiben könnten Methoden, die eine konstante Zeichenfolge zurückgeben, anstatt mit der Web.config zu verwirren. Ich weiß, dass einige Leute sich darüber aufregen, weil Sie die URLs neu kompilieren müssen, aber wie oft werden sie sich ändern?

Falls Sie jedoch diese CDN-verteilten Elemente auf jeder Seite einfügen möchten, was ist falsch daran, die URLs in Ihre Masterseite zu werfen? In den meisten Fällen ist das Ändern der Masterseite genauso einfach wie das Ändern eines web.config-Werts.

+0

Ich mag nur meine Konfiguration in meiner Datei web.config. Es ist leichter zu erkennen und leichter zu lesen als Code. Und es ist nicht nur für Dateien, die in meinen Masterseiten enthalten sind, ich habe viele kleinere Javascript-Dateien, die ich in mehrere Seiten einschließe, und ich möchte eines von ihnen nicht vergessen. –

+0

Es macht Sinn, einige Dinge zu konfigurieren, ich wollte nur, dass Sie darüber nachdenken. Ich bin zu oft in Projekte gekommen, die buchstäblich 150 "toggle" -Flags und verschiedene Werte in der web.config haben, und Sachen werden schließlich dupliziert, weil die Leute vergessen, was sie dort gemacht haben :) –

+0

Das verstehe ich vollkommen. Passiert auch hier. Ich denke nur, dass es praktisch ist, als wenn ich mich entscheide, erst später ein CDN für SWF hinzuzufügen, ich muss nur das Element mit den richtigen Werten hinzufügen und ich bin eingestellt. Ansonsten müsste ich alle meine Aufrufe in Methoden ändern und so weiter. Danke für die Eingabe. –