WCF Channel und ChannelFactory Caching
Also habe ich beschlossen, um die Leistung ein bisschen in meinem WCF-Anwendung und versuchen Sie die cache-Kanäle und die ChannelFactory. Es gibt zwei Fragen, die ich über all dies, die ich brauche, um aufzuräumen, bevor ich loslege.
1) Sollte die ChannelFactory implementiert werden, wie singleton?
2) ich bin irgendwie unsicher wie man cache/Wiederverwendung einzelner Kanäle. Haben Sie Beispiele wie Sie dies tun können, die Sie teilen können?
Wahrscheinlich ist es wichtig zu beachten, dass mein WCF-Dienst bereitgestellt wird, als ein stand-alone-Anwendung, mit nur einem Endpunkt.
EDIT:
Danke für die Antworten. Ich habe noch ein paar Fragen und zwar...
1)ich denke, ich bin verwirrt, wo das caching erfolgen soll. Ich bin die Bereitstellung einer client-API, verwendet dieser code in eine andere Abteilung in unserer Firma. Stellt dieses caching auf dem client erfolgen?
2)Die client API verwendet wird als Teil einer Silverlight-Anwendung, ändert sich dadurch irgendetwas? In allem, was caching-Mechanismen zur Verfügung, die in einem solchen Szenario?
3)ich bin mir immer noch nicht klar, über das design der GetChannelFactory Methode. Wenn ich nur einen service, sollte nur ein ChannelFactory jemals erstellt und zwischengespeichert?
Habe ich noch nicht implementierte caching-Funktion (da bin ich völlig verwirrt darüber, wie es getan werden sollte!), aber hier ist, was ich für die client-proxy so weit:
namespace MyCompany.MyProject.Proxies
{
static readonly ChannelFactory<IMyService> channelFactory =
new ChannelFactory<IMyService>("IMyService");
public Response DoSomething(Request request)
{
var channel = channelFactory.CreateChannel();
try
{
Response response = channel.DoSomethingWithService(request);
((ICommunicationObject)channel).Close();
return response;
}
catch(Exception exception)
{
((ICommenicationObject)channel).Abort();
}
}
}
InformationsquelleAutor der Frage Didaxis | 2011-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die ChannelFactory zu erstellen, die eine Instanz der factory, dann cache-Instanz. Sie können dann erstellen Sie communicatino Kanäle wie erforderlich/gewünscht aus dem Cache istance.
Haben Sie eine Notwendigkeit für mehrere channel-Fabriken (ich.e.., gibt es mehrere Dienstleistungen)? In meiner Erfahrung, das ist, wo sehen Sie den größten nutzen in der Leistung. Erstellen eines Kanals ist eine ziemlich kostengünstige Angelegenheit; es ist alles eingestellt, bis auf der start, der Zeit braucht.
Ich würde nicht cache einzelnen Kanäle - ich würde Sie schaffen, Sie für eine operation, und schließen Sie Sie. Wenn Sie den cache, Sie können Zeit und der Kanal Schuld, dann musst du Abbrechen und einen neuen erstellen sowieso.
Nicht sicher, warum Sie wollen würde, um zu usea singleton zu implementieren ChannelFactory, insbesondere, wenn Sie gehen, um es zu erstellen und zwischenzuspeichern, und es gibt nur einen Endpunkt.
Werde ich einige Beispiel-code später wenn ich etwas mehr Zeit.
UPDATE: Code-Beispiele
Hier ist ein Beispiel, wie ich implementiert diese für ein Projekt bei der Arbeit. Ich verwendet
ChannelFactory<T>
wie die Anwendung, die ich entwickelt wurde, ist eine n-tier-Anwendung mit mehreren Diensten, und weitere Hinzugefügt werden. Ziel war es, eine einfache Möglichkeit zum erstellen einer client einmal pro Lebensdauer der Anwendung, und erstellen Sie Kommunikationskanäle, wie gebraucht. Die Grundlagen der Idee sind nicht von mir (ich habe es aus einem Artikel im Internet), obwohl ich veränderte die Umsetzung für meine Bedürfnisse.Habe ich eine statische helper-Klasse in meiner Anwendung, und innerhalb dieser Klasse habe ich ein Wörterbuch und eine Methode zu erstellen, die Kommunikations-Kanäle von der channelf Fabrik.
Wörterbuch ist wie folgt (Gegenstand ist das Wert, wie es enthält verschiedene Kanal-Fabriken, eine für jeden Dienst). Ich "Cache" in dem Beispiel als eine Art Platzhalter - ersetzen Sie die syntax mit dem, was caching-Mechanismus, die Sie verwenden.
Nächste ist eine Methode, um erstellen Sie einen Kommunikationskanal aus der factory-Instanz. Die Methode überprüft, um zu sehen, ob die Fabrik existiert zuerst - wenn es nicht, Sie schafft es, legt es in das Wörterbuch und generiert dann den Kanal. Sonst wird es generiert einfach einen Kanal aus der zwischengespeicherte Instanz der factory.
Ich ausgezogen habe dieses Beispiel unten einige von dem, was ich bei der Arbeit verwenden. Es gibt eine Menge Sie tun können, diese Methode - Sie in der Lage mehrere Bindungen, zuweisen von Anmeldeinformationen für die Authentifizierung, etc. Es ist ziemlich viel Ihr one-stop-shopping-center für die Erzeugung von einem client.
Schließlich, wenn ich es in der Anwendung, ich in der Regel erstellen Sie einen Kanal, mache mein Geschäft, und schließen Sie es (oder Sie Abbrechen, wenn es sein muss). Zum Beispiel:
Hoffentlich die oben genannten Beispiele geben Ihnen etwas zu gehen. Ich habe mit so etwas wie dies für etwa ein Jahr jetzt in einer Produktionsumgebung und es hat sehr gut funktioniert. 99% aller Probleme, die wir gestoßen haben meist einen Bezug zu etwas außerhalb der Anwendung (externe Kunden oder Daten-Quellen, die nicht unter unserer direkten Kontrolle).
Lassen Sie mich wissen, wenn etwas nicht klar ist oder Sie weitere Fragen haben.
InformationsquelleAutor der Antwort Tim
Konnten Sie immer nur Ihre ChannelFactory-static für jeden WCF-Vertrag...
Sollten Sie sich bewusst sein, dass aus .Net 3.5 die proxy-Objekte zusammengefasst werden aus performance-Gründen durch den Kanal Fabrik. Aufruf der
ICommunicationObject.Close()
Methode tatsächlich gibt das Objekt an den pool in der Hoffnung, es wiederverwendet werden können.Ich würde Blick auf die profiler, wenn Sie wollen, um einige der Optimierung, wenn Sie können verhindern, dass nur ein IO-Aufruf im code könnte es überwiegen bei weitem keine Optimierung machen Sie mit den Kanal-Fabrik. Müssen nicht wählen Sie einen Bereich zu optimieren, verwenden Sie den profiler, um herauszufinden, wo können Sie als Ziel eine Optimierung. Wenn Sie eine SQL-Datenbank, zum Beispiel, werden Sie wahrscheinlich finden einige niedrig hängenden Früchte in Ihren Abfragen, erhalten Sie in Größenordnungen, die Leistung steigt, wenn diese nicht bereits optimiert.
InformationsquelleAutor der Antwort Spence
Erstellen der Kanal Kosten der Leistung so viel. tatsächlich , WCF hat bereits die cache-Mechanismus für die ChannelFactory wenn Sie die ClientBase in der client anstelle des reinen ChannelFactory. Aber der cache abgelaufen sein wird, wenn Sie anditional Operationen(Bitte googeln für details, wenn Sie möchten).
Für die ErOx - Ausgabe, die ich bekam eine andere Lösung, die ich denke, es ist besser. siehe unten:
können Sie anpassen, die Logik und die Parameter der Initiate Methode selbst, wenn Sie noch eine andere Anforderung. aber das initiator-Klasse ist nicht nur ein Endpunkt. es ist leistungsstark für alle endpoint in Ihrer Anwendung. hoffentlich. es funktioniert gut für Sie. BTW. diese Lösung ist nicht von mir. ich habe dies aus einem Buch.
InformationsquelleAutor der Antwort Aiping He