2012-10-18 5 views
6

Ich habe einen ziemlich großen "alten" WCF-Service mit vielen verschiedenen Methoden.Change Timeout für jede WCF-Methode oder Anruf

Die meisten dieser Methoden sind „normal“, so dass sie in weniger als 10 Sekunden zu beantworten, aber es gibt mehrere Methoden (8 oder 9), die langen Prozesse sind, so dass sie eine lange Zeit, um eine Antwort zu erhalten nehmen.

Die receivetimeout und Sendtimeout wurden 00.40.00 setzten sie genug, diese Prozesse zu erreichen hatte Zeit zu gewährleisten.

Das Problem ist manchmal Verbindungsprobleme und die „normalen“ Methoden nehmen eine wirklich lange Zeit zum Absturz zu bringen ...

Sie sind alle in dem gleichen Service, den wir haben, weil sie ein wirklich großes Modell verwenden und sie wollten Verwenden Sie das Modell bei jedem Aufruf erneut aus dem Dienst (ohne einen PersonService.User und einen RobotsService.User ..., da sie in verschiedenen Diensten dieselbe Klasse haben).

Die erste Lösung, die ich mir vorstelle ist, einen anderen Service mit diesen langen Prozessen zu machen und eine kurze Zeitüberschreitung auf den normalen Service zu setzen ... aber ich sollte viele Änderungen vornehmen wegen der Verwendung des Modells ...

Gibt es eine Möglichkeit, bei jedem Anruf ein anderes Zeitlimit festzulegen? Oder nach Service-Methode? Soll ich den Service trotzdem kaputt machen?

Vielen Dank im Voraus!

+1

Sie für jeden Aufruf der Proxy-Objekt neu erstellt werden? Wenn ja, siehe diesen Link für eine mögliche Lösung: http://stackoverflow.com/questions/1826392/programatically-set-wcf-timeout-in-debug-mode – wal

+0

Nein, ich bin nicht, ich habe ein Singleton für die Proxy. – zapico

Antwort

7

Zunächst ist die Zeit für die Konfiguration in Ihrem Fall OperationTimeout, wodurch das Zeitlimit warten kann, bis der Dienst antwortet, bevor das Zeitlimit überschritten wird. Sie können das Betriebszeitlimit ändern, bevor Sie einen Anruf von der Clientseite tätigen.

Um die OperationTimeout auf dem Kanal zu setzen, können Sie case Ihre Proxy/Kanal-Instanz als IContextChannel eingeben und OperationTimeout setzen.

Zum Beispiel:

IClientChannel contextChannel = channel as IClientChannel; 
contextChannel.OperationTimeout = TimeSpan.FromMinutes(10); 

HTH, Amit

+0

Und wie konfiguriere ich dieses OperationTimeout ?? Danke für Ihre Antwort :) – zapico

+1

Bearbeitete meine Antwort, um angeforderte Informationen zu enthalten, Prost! – amit

+1

Wie machst du das thread-sicher angesichts der gleichzeitigen Nutzung des Kanals? Das Festlegen von "client.InnerChannel.OperationTimeout" und das anschließende Aufrufen des Dienstes aus mehreren Threads funktioniert nicht. Aber ich weiß, dass die OperationTimeout-Einstellung einmal zu Beginn der Operation gelesen wird, und dann bleibt dieser Wert für diesen Aufruf konstant, auch wenn Sie den OperationTimeout des Kanals ändern. Ich weiß einfach nicht, wo der richtige Punkt sein würde - wenn es einen gibt - um es über Fäden hinweg arbeiten zu lassen. –