Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WCF Channel Close - wie richtig?
_daniel_
myCSharp.de - Member



Dabei seit:
Beiträge: 227

Themenstarter:

WCF Channel Close - wie richtig?

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.819
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
_daniel_
myCSharp.de - Member



Dabei seit:
Beiträge: 227

Themenstarter:

beantworten | zitieren | melden

Hallo,
da ich Clientseitig das Interface habe das der Service implementiert brauch ich ja keine Proxyklassen erstellen sondern kann direkt damit arbeiten.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 538
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Grumbler85 am .
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)
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.819
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
_daniel_
myCSharp.de - Member



Dabei seit:
Beiträge: 227

Themenstarter:

beantworten | zitieren | melden

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"
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _daniel_ am .
private Nachricht | Beiträge des Benutzers
mg.net
myCSharp.de - Member



Dabei seit:
Beiträge: 153

beantworten | zitieren | melden

Ich nehme an, das Binding ist netTcpBinding? Ist TCP-Port Sharing dann eingerichtet und konfiguriert?
private Nachricht | Beiträge des Benutzers
_daniel_
myCSharp.de - Member



Dabei seit:
Beiträge: 227

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers