Laden...

WCF Channel Close - wie richtig?

Erstellt von _daniel_ vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.042 Views
_
_daniel_ Themenstarter:in
227 Beiträge seit 2006
vor 12 Jahren
WCF Channel Close - wie richtig?

Hallo,
ich hab einen WCF Service mit
ConcurrencyMode = ConcurrencyMode.Single und
InstanceContextMode = InstanceContextMode.PerCall
mit einem WsHttpBinding (einzigste änderung: höhere maxReceivedMessageSize)

Nun hab ich am Client


var cf = new ChannelFactory<contract>();
var channel = cf.CreateChannel();

for (int i = 0; i < 50000; i++){
  channel.machwas();
}

((System.ServiceModel.Channels.IChannel)channel).Close();

In der Annahme, dass derselbe Channel benutzt wird. Nun erhalte ich aber nach einiger Zeit eine Exception, dass kein Endpunkt an meiner Adresse hört.

Schaue ich mir netstat -a an, sehe ich dass wohl alle Ports in gebrauch sind.

Wo liegt mein Denkfehler? Was muss ich ändern?

Den ConcurrencyMode oder InstanceContextMode kommt nur dann in Frage, wenn im Endeffekt jeder Channel seine eigene Instanz des Service Serverseitig bekommt. Würde InstanceContextMode.Single dies noch erzielen?

6.910 Beiträge seit 2009
vor 12 Jahren

Hallo,

ich verwende für die WCF-Infrastruktur immer eigene Proxy-Klassen welche die Vorgänge öffenen und schließen übernehmen. Siehe Proxy-Klassen erstellen. Vllt. findest du damit Abhilfe zum Problem.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

_
_daniel_ Themenstarter:in
227 Beiträge seit 2006
vor 12 Jahren

Hallo,
da ich Clientseitig das Interface habe das der Service implementiert brauch ich ja keine Proxyklassen erstellen sondern kann direkt damit arbeiten.

G
538 Beiträge seit 2008
vor 12 Jahren

Und wie kommuniziert dein Client mit dem Service ohne Proxy?

/edit
Pardon das war zu schnell geschrieben und zu wenig gedacht

nichts desto trotz ist die Kapselung durch einen Proxy durchaus Sinnvoll

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

6.910 Beiträge seit 2009
vor 12 Jahren

Hallo,

sicher - über die Channelfactory. Meine Proxyklasse vom Link kapselt aber das erstellen der Channels und verwendet auch das Interface vom ServiceContract, im Beispiel IFooService.

Ich finde es besser wenn das Erstellen/Öffnen/Schließen wiederverwendbar implementiert ist - zumal auch der Benutzercode viel einfacher wird. Dies ginge zwar auch mit den Klassen die per svcutil erstellt werden, diese haben aber etliche Nachteile so dass es vorteilhafter ist hier selbst einen Proxy zu schreiben bzw. die ProxyBase aus dem Link zu verwenden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

_
_daniel_ Themenstarter:in
227 Beiträge seit 2006
vor 12 Jahren

danke gfoidl, hab da wohl was falsch verstanden bei deinem Link. Probier ich gleich mal. Danke

Mit der verlinkten Proxy-Klasse leider keine Verbesserung.

Tausende Verbindungen bei netstat sichtbar mit Status "TIME_WAIT"

M
153 Beiträge seit 2010
vor 12 Jahren

Ich nehme an, das Binding ist netTcpBinding? Ist TCP-Port Sharing dann eingerichtet und konfiguriert?

_
_daniel_ Themenstarter:in
227 Beiträge seit 2006
vor 12 Jahren

Nein, es ist WsHttpBinding

In meinem Fall hilft ein Thread.Sleep(10) an manchen stellen um den "verbrauchten" Channels zeit zum aufräumen zu verschaffen.
Wieso die nicht wiederverwendet werden, ist mir weiterhin ein rätsel