2008-12-01 4 views

Antwort

5

Zusätzlich zu den Dingen, die Guy Starbuck erwähnt, wäre ein Schlüsselfaktor das Sicherheitsmodell, das Sie verwenden (in Verbindung mit den Sitzungsanforderungen) - wenn Sie Ihren Proxy nicht wiederverwenden, können Sie nicht Verwenden Sie eine Sicherheitssitzung.

Dies bedeutet, dass der Client sich bei jedem Aufruf authentifizieren müsste, was verschwenderisch ist.

Wenn Sie jedoch entscheiden, dass dies das ist, was Sie tun möchten, stellen Sie sicher, dass der Client keinen Sicherheitskontext erstellt (wie Sie ihn nie benutzen werden). Dadurch ersparen Sie sich ein paar Roundtrips zum Server :-)

3

Es gibt eine logische Folge hier Server aktivierte Objekte in .NET Remoting (eine der Technologien, die WCF ersetzt wird), die zwei Modi haben, "Single Call" (zustandslos) und "Singleton" (Stateful).

Der Ansatz von WCF sollte auf Ihren Leistungs- und Skalierungsanforderungen in Verbindung mit den Anforderungen Ihrer Kunden sowie auf serverseitigen Designbeschränkungen basieren.

Wenn Sie den Status zwischen den Aufrufen des Dienstes beibehalten müssen, möchten Sie natürlich eine statusbehaftete Instanz haben, aber wenn Sie dies nicht tun, sollten Sie sie wahrscheinlich so implementieren, dass sie besser skaliert werden kann kann Balance leichter laden, etc).

+0

ich Brian glauben bittet um die Wiederverwendung von Client-Proxy. Dies ist für den Lebenszyklus der serverseitigen Instanz nicht relevant –

+0

Mein Down-Vote ist aus dem gleichen Grund wie Andrey. Ich sehe nicht, was das InstanceManagement auf der Serverseite mit der Lebensdauer des clientseitigen Proxys zu tun hat. Vielleicht könntest du es erklären? –

+0

Sie haben beide Recht, es scheint, dass ich ursprünglich die Frage als auf den Serverlebenszyklus bezogen, nicht Client-Proxy interpretiert. Ich werde fortfahren und meine Antwort hier als Teil der Diskussion hinterlassen, da sie in den Antworten anderer Leute erwähnt wird. –

5

Ein weiterer zu berücksichtigender Punkt sind Kanalfehler. Standardmäßig kann WCF den Client-Proxy nicht verwenden, nachdem eine nicht behandelte Ausnahme aufgetreten ist.

IMyContract proxy = new MyContractClient(); 
try 
{ 
    proxy.MyMethod(); 
} 
catch 
{} 

//Throws CommunicationObjectFaultedException 
proxy.MyMethod(); 
15

Oder ist es besser, zu erstellen und sie wiederverwenden?

Beginnen Sie nicht mit der Implementierung Ihrer eigenen Poolimplementierung. Das wurde bereits im Rahmen getan. Ein WCF-Proxy verwendet im Cache gespeicherte Kanäle. Daher ist das Erstellen neuer Proxys nicht übermäßig teuer (aber siehe die Antwort von Guy Starbuck bezüglich Sitzungen und Sicherheit!).

Beachten Sie auch, dass ein Proxy nach einer bestimmten Leerlaufzeit (standardmäßig 10 Minuten) abbricht.

Wenn Sie eine explizitere Kontrolle wünschen, können Sie ChannelFactories und Kanäle direkt anstelle der ClientBase-Proxies "einfach zu verwenden" verwenden.

http://msdn.microsoft.com/en-us/library/ms734681.aspx

Und zu diesem Thema "must read" ist: http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx