2012-10-04 13 views
6

Am stecken auf, was sicher ist ein grundlegendes und leicht zu lösendes Problem in WCF, müssen nur auf den richtigen Weg geführt werden.Persist-Objekt in C# .NET-Webdienst

Ich habe ein großes Objekt (das ist eigentlich ein trainierter Textklassifizierer), die ich über einen Webdienst in C# .NET verfügbar machen muss. Das Classifier-Objekt kann von der Festplatte geladen werden, wenn der Service anfängt, aber ich möchte es nicht für jede Anfrage von der Festplatte laden (das Objekt, das Anfragen bearbeitet, belegt derzeit etwa 6 GB im Speicher, und es dauert eine Weile) lade es von der Platte für jede Anfrage), also Ich möchte dieses Objekt im Speicher für alle Anfragen an diesen Web Service und dauerhaft das Objekt sollte nur geladen werden, wenn der Dienst startet (anstatt es beim ersten laden Web-Anfrage löst es aus).

Wie würde ich das machen?

Danke für jede Hilfe!

+0

Planen Sie auf IIS oder in Ihrem eigenen [ServiceHost] (http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx) zu hosten? – OffHeGoes

+0

IIS ideal, aber bin einfach, wenn eine andere Option mehr Sinn macht. – ToOsIK

+1

Nun, persönlich würde ich IIS verwenden, wenn ich dies der Außenwelt offen legen würde, aber es ist einfacher, den Zustand in einem Windows-Dienst zu erhalten, der einen Web-Service mit einem ServiceHost verfügbar macht. – OffHeGoes

Antwort

5

Wahrscheinlich ist der einfachste Weg, Ihren Dienst als singleton zu erstellen. Dies beinhaltet die Angabe von InstanceContextMode = InstanceContextMode.Single in einem ServiceBehavior Attribut in Ihrer Serviceklassen-Definition.

jedoch es ist sehr fraglich, ob ein 6GB Objekt über den Draht zu senden mithilfe von WCF ratsam ist. Sie können mit diesem Ansatz auf alle Arten von Problemen mit der Verfügbarkeit von Diensten stoßen.

Darüber hinaus sind Singletons nicht innerhalb eines Hosts skalierbar (es kann nur eine Instanz pro Host sein), obwohl Sie mehrere Singleton-Services hosten und dann die Anforderungen ausgleichen können.

+0

Danke für die Antwort hugh, bin nicht wirklich das 6GB Objekt senden ... alles, was ich tun muss, ist sicherzustellen, dass dieses Objekt geladen wird, bevor alle Anfragen an den Web-Service kommen (so in der Initialisierungsphase geladen), und dass alle Anfragen wird mit diesem einen Objekt (das etwa 6 GB groß ist) bedient, anstatt dass jede Anfrage ein eigenes separates Objekt erzeugt. Ich denke, Sie haben Recht und Singleton Services ist der richtige Weg! – ToOsIK

+0

@ToOsIK Wahrscheinlich eine gute Idee, um Ihre Frage zu aktualisieren. Es sah aus, als ob Sie versuchten, ein 6-GB-Objekt über WCF zu senden. –

+1

Sie müssen wahrscheinlich mit ServiceHost für Ihr Szenario selbst hosten. Siehe @hugh Singleton Link "Vielleicht dauert die Initialisierung der knappen Ressource, die der Singleton verwaltet, zu viel Zeit und Sie möchten den ersten Client nicht bestrafen." – OffHeGoes

3

Der Weg, den ich in Projekten gemacht habe, in denen ich das Problem in der Vergangenheit hatte, besteht darin, den WCF-Dienst in einem Windows-Dienst selbst zu hosten.

Ich habe dann das Datenspeicherobjekt innerhalb des Dienstes als Singleton eingerichtet, die für die Lebensdauer des Dienstes bestehen bleibt. Jeder WCF-Serviceaufruf erhält dann jedes Mal den Singleton, wenn er etwas mit den Daten tun muss.

Ich würde vermeiden, in IIS zu laufen, einfach weil Sie nicht direkte Kontrolle über die Lebensdauer des Dienstes haben und daher nicht genügend Kontrolle darüber haben, wenn Dinge entsorgt und instanziiert werden.

+0

Ich stimme zu, ich hatte unzählige Probleme mit der Kontrolle eines Dienstes zur Verfügung und Instanziierung, haben Sie irgendwelche Literatur über Selbst-Hosting ein WCF-Dienst in einem Windows-Dienst? – ToOsIK

+0

Microsoft hat eine ziemlich gute Einführung in es [How to: hostet einen WCF-Dienst in einer verwalteten Anwendung] (http://msdn.microsoft.com/en-us/library/ms731 758.aspx) Artikel; Wenn es helfen würde, werde ich auch meine Antwort mit Code aktualisieren. –

+0

Vielen Dank für Ihre Antwort und dafür, dass Sie mich auf den Win Service-Ansatz aufmerksam gemacht haben. Da Hughs Antwort eher zu der Frage passt, die ich gestellt habe, habe ich seine als die richtige Antwort auf die Frage akzeptiert, obwohl Ihr Kommentar eine absolute Notwendigkeit ist, wenn ich die Stabilität meines Dienstes sicherstellen möchte. Vielen Dank! – ToOsIK