Die Anwendung, die wir erstellen, sendet regelmäßig verschiedene Arten von E-Mails. Ich habe die E-Mail-Vorlagen in einem Azure-Blobspeicher gespeichert und die Methoden, die für das Senden von E-Mails zuständig sind, ziehen die entsprechenden E-Mail-Vorlagen von dort. Ich möchte, dass die Vorlagen außerhalb des gehosteten Diensts liegen, falls ich sie aktualisieren möchte. Dazu kann ich einfach neue Vorlagen in den Blob hochladen.
Das Problem, das ich aus Leistungs- und Kostenperspektive habe, ist, dass sich die E-Mail-Vorlagen innerhalb von 24 Stunden kaum ändern. Das Caching der Methode ähnlich wie [OutputCache(Duration = duration, VaryByParam = "id")]
in ASP.NET MVC ist daher eine ideale Lösung, um die Leistung der Worker-Rolle zu erhöhen. Wie das geht, ist jetzt ein Problem. Ich habe von PostSharp erfahren, aber unser Budget hat die Lizenzgebühren von PostSharp nicht von Anfang an berücksichtigt!
Weitere kostenlose Alternativen? Danke, dass Sie mir geholfen haben.
PostSharp Starter Edition ist kostenlos und würde Ihre Anforderungen erfüllen.
Ich habe das Caching auf Methodenebene in der Vergangenheit mithilfe der folgenden Kombination implementiert:
Das benutzerdefinierte Attribut und der Interceptor können relativ einfach eingerichtet werden. Das Hauptproblem beim Caching auf Methodenebene ist, wie ich glaube, wie Sie Cachetreffer und Fehltreffer auf optimale, aber dennoch präzise Weise bestimmen.
In meinem Fall musste es generisch sein (jede Art von Methodenaufruf und Parametern unterstützen), also musste ich eine flexible Möglichkeit schaffen, alle Methodenparameterwerte zu hashen, um einen Aufruf von einem anderen zu unterscheiden. Aber in Ihrem Fall könnte dies ein sehr spezifischer Interceptor sein, der die Struktur Ihres Methodenaufrufs bereits kennt, was die Dinge viel einfacher machen würde.
Jetzt zum eigentlichen Caching können Sie die Caching-Unterstützung von .NET nutzen, die im Namespace System.Runtime.Caching
verfügbar ist, der bereits ein MemoryCache , wenn das für Sie geeignet ist.
Haben Sie darüber nachgedacht, lokale Speicherressourcen zu verwenden, um die Vorlagen aus dem Speicher zu entfernen? Sie können ein Intervall in der Methode Ausführen der RoleEntryPoint .
[Aktualisieren]
Ich war vielleicht oben nicht klar gewesen. Die Vorlage sollte im Blob Storage gespeichert werden. Lokaler Speicher würde verwendet, um eine Kopie der Vorlage lokal auf jeder Instanz des Dienstes zwischenzuspeichern. Wenn Sie den ETag in einer separaten Datei speichern, können Sie überprüfen, ob sich die Vorlage vor der Übertragung des Blobs geändert hat, z. B .:
Lesen Sie im RoleEntryPoint das Etag aus der Datei * .tag.tpl. Senden Sie Ihre Anfrage gegen Blob-Speicher mit einem bedingten Header , der das Etag weitergibt mit einer Zugriffsbedingung If-None-Match . Wenn das Blob nicht aktualisiert wurde, wird ein HTTP 304 Nicht geändert Response-Code zurückgegeben. Wenn es aktualisiert wurde, wird das Blob heruntergeladen.
[/ Update]
Wenn Sie nur AOP-Funktionalität haben wollen, können Sie etwas wie Ninject Interception verwenden.
Sie können versuchen, KingAOP zu verwenden - einfach für solche Aufgaben. Der Hauptunterschied ist:
1) Erzeugen von Code in der Laufzeit, ohne zusätzliche Kompilierzeit zu verschwenden.
2) basiert auf "dynamisch" - es bedeutet, dass Ihr Code über offizielle C # -Compiler generiert wird.
Es ist ein Open-Source-Projekt: Ссылка
Werfen Sie einen Blick auf Artikel:
Ссылка
Tags und Links asp.net-mvc azure c# caching