Benutzer mit den meisten Antworten
Synchrone, parallele Aufrufe eines WebService scheinen sich zu blockieren

Frage
-
Hallo,
ich habe ein Problem bei der Anbindung eines Webservices:
- .NET 4.0 Client
- .NET 2.0 WebService als ServiceReference eingebunden
In meinem Client werden zwei verschiedene Verarbeitungen mit zwei verschiedenen Timern (mit unterschiedlichen Intervallen) gestartet. Die gestarteten Methoden gehören zur gleichen Klassen und auch Instanz. In beiden Methoden verwenden jeweils synchron Methoden des Webservices, welcher jeweils innerhalb eines usings instanziiert wird, aufgerufen.
Wenn beide Methode gleichzeitig laufen scheinen sie sich gegenseitig zu blockieren - Dann bekommt die Methode, die als zweites innerhalb ihres usings landet, beim ersten WebService-Aufruf einen Timeout, wobei ich beim Debuggen festgestellt habe, dass dieser Aufruf erst im WebService ankommt, wenn der Client bereits einen Timeout-Fehler geworfen und damit das using wieder verlassen hat.
Es wirkt auf mich also, als würde der Client nicht damit klarkommen gleichzeitig mit zwei Instanzen des gleichen WebService zu kommunizieren. Kann das sein oder kann eine intensive Nutzung des WebService durch Methode A dieses Verhalten bei Methode B erzeugen? Wenn ich den WebService nicht in den Methoden Erzeuge, sondern ihn klassenweit bekanntmache und im Konstruktor instanziiere bekomme ich nach einer Weile zwar auch noch einen Timeout, aber zumindest komme ich bei beiden Methoden über den ersten WebService-Aufruf hinaus...
Grüße
Andreas
Donnerstag, 8. September 2011 14:27
Antworten
-
Hallo, es ist möglich, dass eine Clientanwendung mehrere Threads anlegt und dann versucht, gleichzeitig mehrere Operationen in derselben Sitzung aufzurufen. In den Standardeinstellungen arbeitet ein Dienst mit nur einem Thread (Single-Threaded). Er verarbeitet also immer nur eine einzige Anforderung gleichzeitig. Falls eine neue Anforderung eintrifft, während der Dienst noch eine vorherige Anforderung verarbeitet, sorgt die WCF-Runtime dafür, dass die neue Anforderung warten muss, bis die erste Anforderung abgeschlossen ist.
Dieses Verhalten kann man ändern. Das Attribut ServiceBeahvior hat eine Eigenschaft ConcurrencyMode
Über diese Eigenschaft kann man festlegen wie gleichzeitige Anfragen in derselben Sitzung verarbeitet werden.
standardwert ist ConcurrencyMode.Single
Du solltest Deinem Service ConcurrencyMode.Multiple zuweisen.
Also:
[ServiceBehavior(..., ConcurrencyMode = ConcurrycyMode.Single)]
public calss MyLittleService: IMyLitteServiec
{
...
}
- Als Antwort markiert Robert BreitenhoferModerator Montag, 3. Oktober 2011 14:22
Dienstag, 27. September 2011 08:28
Alle Antworten
-
Hallo, es ist möglich, dass eine Clientanwendung mehrere Threads anlegt und dann versucht, gleichzeitig mehrere Operationen in derselben Sitzung aufzurufen. In den Standardeinstellungen arbeitet ein Dienst mit nur einem Thread (Single-Threaded). Er verarbeitet also immer nur eine einzige Anforderung gleichzeitig. Falls eine neue Anforderung eintrifft, während der Dienst noch eine vorherige Anforderung verarbeitet, sorgt die WCF-Runtime dafür, dass die neue Anforderung warten muss, bis die erste Anforderung abgeschlossen ist.
Dieses Verhalten kann man ändern. Das Attribut ServiceBeahvior hat eine Eigenschaft ConcurrencyMode
Über diese Eigenschaft kann man festlegen wie gleichzeitige Anfragen in derselben Sitzung verarbeitet werden.
standardwert ist ConcurrencyMode.Single
Du solltest Deinem Service ConcurrencyMode.Multiple zuweisen.
Also:
[ServiceBehavior(..., ConcurrencyMode = ConcurrycyMode.Single)]
public calss MyLittleService: IMyLitteServiec
{
...
}
- Als Antwort markiert Robert BreitenhoferModerator Montag, 3. Oktober 2011 14:22
Dienstag, 27. September 2011 08:28