6

Wir haben Hybrid-Anwendung, die noch Teil der Anwendung mit klassischen ASP entlang ASP.NET MVC läuft. Ich möchte gebündeltes JavaScript und Stile in klassischen ASP auch verwenden.ASP.NET MVC Bundles in klassischen ASP (oder PHP usw.)

In ASP.NET können wir gut gebündelte Sachen mit Caching schön verwenden, verwenden wir Script.Render, die Versionshash der Abruf-URL hinzugefügt.

Die Sache ist, dass diese Methode natürlich nicht in Classic ASP verfügbar ist.

Wir können gebündelt direkt von html <script src="bundles/js?v=<%=version%>"/>. Versionsvariable ist eine klassische ASP-Variable, die beim Cache-Busting verwendet wird (Forciere Browser-Aktualisierung). Es wird zwischen den Versionen geändert.

Problem ist, dass, wenn klassische ASP nicht richtigen Hash zu Bundle-Anfrage geben, MVC Bündelung Header caching: no-caching zurückgibt, die Browser angibt, um es nicht zu cachen.

Haben Sie gute Ideen? Könnte dieser Hash im klassischen ASP berechnet werden? Könnten Sie Bundling sagen, Caching ohne v = hash zu erlauben? Könnte v = Hash von MVC beim Start übertragen werden? Wir haben Mechanismen, um Variablen zwischen klassischem ASP und MVC zu übertragen, aber dieser Hash ist irgendwie aus dem MVC-Startcode erreichbar.

+1

Hashing, Bündelung, MVC? In [Klassik-Asp]? ** Sind Sie absolut und absolut sicher, dass Sie über Classic ASP ** sprechen? – Rafael

+1

Wir haben eine Hybrid-Anwendung, die sowohl ASP.NET MVC4 als auch Classic ASP verwendet, während wir langsam auf ASP.NET MVC4 migrieren. Hybrides Zeug funktioniert ganz gut, denn http, html und javascript funktionieren in beiden. Die klassische ASP-Seite kann beispielsweise jQuery-Ajax-Aufrufe an ASP.NET MVC-Controller ausführen und reine HTML-Ausgaben erhalten. –

+2

Vertrau mir, ich weiß, was ich tue. - Vorschlaghammer. Bitte überdenken Sie die negative Abstimmung, das ist legitime Frage. –

Antwort

3

AardVarks wilder Gedanke gab mir einige Ideen und ich habe es selbst herausgefunden. Lösung selbst ist ziemlich einfach.

Hier ist die Lösung für alle, die eine ähnliche Lösung benötigen.

Nachdem Sie das Bündel in ASP.NET MVC (Global.asax.cs oder BundleConfig) registriert:

 List<string> bundleHtml = new List<string>(); 
     bundleHtml.Add(Scripts.Render("~/bundles/legacybase").ToString()); 
     bundleHtml.Add(Styles.Render("~/styles/legacycss").ToString()); 
     File.WriteAllLines(Server.MapPath("~/dyn_legacy_bundle.inc"), bundleHtml, System.Text.Encoding.UTF8); 

Diese Datei dyn_legacy_bundle.inc erzeugen, die den richtigen <script> -Tags enthält, die umfassen der Versions-Hash (oder Debug-Versionen, wenn Debug aktiviert ist).

im klassischen ASP (oder einige verworrene PHP usw.):

<head> 
    <!--#include file="dyn_legacy_bundle.inc" --> 
</head> 

Dies wird dann die Datei verwenden, die beim Start von ASP.NET generiert wurde, und verwenden Sie die mitgelieferte CSS/Javascript.

Negative Sache ist, dass wenn gebündelte Dateien zur Laufzeit geändert werden, diese dynamische Datei nicht aktualisiert wird. Das führt dazu, dass Bündel nicht zwischengespeichert werden. App-Pool-Recycling wird schließlich Caching beheben, also denke ich, dass wir damit leben werden. Lassen Sie es mich wissen, wenn Sie herausfinden, wie Sie das vermeiden können.

Beachten Sie, dass dies auch mit jedem anderen Rahmen funktionieren (dh PHP.)

1

Eine weitere Option:

-Setup ein Handler (dh Bundles.ashx)

public void ProcessRequest (HttpContext context) { 
    context.Response.ContentType = "text/html"; 
    context.Response.Write(System.Web.Optimization.Styles.Render("~/css")); 
} 

Aus php:

echo file_get_contents("http://example.com/Bundles.ashx"); 

Sie können den Querystring verwenden, um verschiedene Bundles anzugeben.

+0

Ruft der file_get_contents tatsächlich die Daten über HTTP-Anforderung ab? Dies kann zu Problemen mit der Leistung und dem Caching usw. führen. –