Ich habe einen WCF-Dienst, der manchmal einen Fehler zurückgeben muss. Aus irgendeinem Grund beginnen die Aufrufe an meinen Dienst mit dem folgenden Fehler zu Timeout: Msgstr "" "Der Anfragekanal wurde während des Wartens auf eine Antwort nach 00: 00: 59.8906201 beendet. Erhöhen Sie den Timeout - Wert, der an den Aufruf von Request übergeben wurde, oder erhöhen Sie den SendTimeout - Wert für die Bindung. Die Zeit, die dieser Operation zugewiesen wurde, kann ein Teil von a gewesen sein." längeres Timeout. "
Nach der Untersuchung des Problems ergab sich ein Muster: Wenn der Dienst 10 Mal einen Fehler gemeldet hatte, beginnt die Zeitüberschreitung. Also habe ich einen Testservice erstellt von:
%Vor%Und ein Testclient:
%Vor%Dies tritt nur auf, wenn der Dienst eine FaultException zurückgibt. Wenn eine normale Ausnahme ausgelöst wird, kann der Dienst nach dem zehnten Anruf weiter ausgeführt werden. Offensichtlich möchte ich meine Ausnahmen schön verpacken, also ist das Werfen normaler Ausnahmen keine echte Option.
Warum treten diese Timeout-Ausnahmen auf? Vielen Dank im Voraus für jede Hilfe ..
Anscheinend sollte der Client-Code wie folgt aussehen:
%Vor%Der Aufruf von client.Abort () sollte immer der letzte Ausweg sein.
Ich habe nicht genug Punkte um zu kommentieren, also neue Antwort ...
Selbst gehostete Dienste erlauben nur maximal 10 gleichzeitige Verbindungen - unabhängig vom Transport. Wenn Sie WCF-Dienste innerhalb von IIS / WAS ausführen, sollten Sie sich darüber keine Gedanken machen (es sei denn, Sie befinden sich unter XP / Vista, wo auch die maximale Anzahl gleichzeitiger Verbindungen 10 beträgt).
Die Unterschiede zwischen einer Fehlerausnahme und einer regulären Ausnahme in diesem Szenario können für das Ergebnis, das Sie sehen, verantwortlich sein.
Denken Sie daran, dass eine reguläre unbehandelte Ausnahme den Kanal stört. Ich nehme an, dass dies eine verfügbare Verbindung eröffnet. Wenn Sie einen Fehler zurückgeben, wird automatisch der Kanal gestört, weil Sie etwas mit der Verbindung machen und den Fehler an Ihrem Ende behandeln können, weil es sich um einen möglichen "erwarteten" Fehler handelt, während eine unbehandelte Ausnahme nicht existiert.
>Auch wenn Sie einen Fehler zurückgeben, müssen Sie die Verbindung dennoch abbrechen (). Darunter befinden sich auch nicht verwaltete Ressourcen. Stellen Sie daher sicher, IDisposable auf den Aufrufern Ihrer Clients / Proxys zu implementieren.
Ich denke, dies könnte daran liegen, dass das Standardverhalten eines WCF-Dienstes 10 gleichzeitige Sitzungen ist. Halten Sie die Verbindungen nach dem Auftreten der FaultExceptions offen? Sie können versuchen, diesen Wert in der BehaviorConfiguration (ServiceThrottling & gt; MaxConcurrentSessions) zu ändern, und sehen, ob sich das ändert. Ich empfehle Ihnen, den Microsof Service-Konfigurationseditor zu verwenden, um herauszufinden, welche anderen Werte standardmäßig festgelegt sind. ( MSDN )
hoffe das hilft ...
Ich hatte das gleiche Problem. Bei näherem Hinsehen stellte sich heraus, dass ich den Webservice-Client nicht schließen wollte, nachdem ich die Aufrufe an den Webservice beendet hatte. Sobald ich das getan habe, ist es auch nach 10 Methodenaufrufen an den Webservice nicht gescheitert. Siehe das folgende Beispiel.
%Vor%richtiges Muster:
%Vor% ClientBase
implementiert IDisposable
, wodurch Close()
innerhalb der Methode Dispose
aufgerufen wird.
Ich könnte hier falsch liegen, aber ich denke, es hat etwas mit dem Hosting des WCF-Dienstes zu tun.
Weil es möglicherweise nicht in der Lage ist, zeitnah auf die Anfrage zu antworten.
IIS unter Windows XP kann zum Beispiel auf 5 gleichzeitige Anfragen antworten (und ich bin mir nicht so sicher). Wenn mehr Anfragen gestellt werden, werden sie in eine Warteschlange gestellt.
Und ich glaube, dass es die Anfragen verlieren könnte und dies tun würde, ohne sie zu verarbeiten, da Ihr Test tatsächlich nur eine Ausnahme auslöst.
Tags und Links wcf .net exception web-services fault