Die I/O-Vorgang wurde abgebrochen wegen entweder ein thread beenden oder auf Antrag hin in WCF

Habe ich schon gesehen, die folgenden Fragen zu stellen und Ihre nicht funktionierende Antworten.

  1. Egal was ich versuche: Der I/O-Vorgang wurde abgebrochen wegen entweder ein thread beenden oder eine Anwendung anfordern
  2. Die I/O-Vorgang wurde abgebrochen wegen entweder ein thread beenden oder eine Anwendung anfordern
  3. Die I/O-Vorgang wurde abgebrochen wegen entweder ein thread beenden oder eine Anwendung anfordern

Ich habe eine Konsole-Anwendung, mit der ich bin-stress-Tests mein WCF-Dienst. Wenn ich mehr als 80 gleichzeitige Anrufe zum service, manchmal funktioniert alles in Ordnung, und manchmal einige der Aufrufe fehlschlagen, mit der folgenden Ausnahme.

Ausnahme Typ: System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Nachricht: Die E/A-Vorgang wurde abgebrochen wegen entweder ein threadbeendigung oder einer Anwendungsanforderung

StackTrace:

System.ServiceModel.- Kanäle.SocketConnection.HandleReceiveAsyncCompleted()

System.ServiceModel.- Kanäle.SocketConnection.OnReceiveAsync(Object sender, SocketAsyncEventArgs eventArgs)

System.ServiceModel.- Kanäle.SocketConnection.OnReceiveAsyncCompleted(Object sender, SocketAsyncEventArgs e)

System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)

System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)

System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)

System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Rufe ich folgenden code mit Schleifen :

var tcpb = new NetTcpBinding();
TimeSpan timeOutAfter =  new TimeSpan(0, 10,0);
tcpb.OpenTimeout = timeOutAfter;
tcpb.SendTimeout = timeOutAfter;
tcpb.CloseTimeout = timeOutAfter;
tcpb.Security.Mode = SecurityMode.None;

string address = "net.tcp://" + MYIP + ":" + PORTNUMBER + "/" + PORTTYPE + "/";

ChannelFactory<ServiceName> channelFactory = new ChannelFactory<ServiceName>(tcpb,address);
var client = channelFactory.CreateChannel();
((IClientChannel)client).Open();
//Function Call here
((IClientChannel)client).Close();
channelFactory.Close();

Ideen und Lösungen sind wir sehr dankbar.

  • sollten Sie post code, wenn Sie wollen, den Völkern zu helfen.... Zeigen, wie Sie testen den service.
  • Ich habe meine Berufung code in meiner Frage.
  • sind Sie sicher, dass Sie warten lange genug, nach dem Aufruf? Wenn Sie ausführen, viele gleichzeitige Anrufe, dann würde ich denke, Sie könnte einige Verzögerung in der Antwort. Bist du nicht möglicherweise heruntergefahren die Steckdose zu früh?
  • Alle meine timouts sind 10 Minuten. Ich bin nicht immer irgendwelche timeouts in Spuren.
  • ok, aber ich sehe, dass Sie anruft .Close()... Wann wird das Wesen genannt? Sofort? Wie Sie sehen können in dem stack-trace, der Fehler tritt auf, während auf eine Antwort wartet.
  • "Alle meine Auszeiten" => darunter auf dem server? Letztes mal hatte ich dieses problem schon jemand geändert receiveTimeout von 5 Minuten auf 5 Sekunden. Ich habe auch dieses problem durch certificate revocation-checks zu lange dauert (extern Zugriff auf eine Ressource mit einem self signed cert aber das cert hatte einen CRL-server, deren Adresse wurde intern). Wenn ich mehr als 80 gleichzeitige Anrufe auf der service Auch halten Sie ein Auge für service-Drosselung und die listen-Rückstand.
  • Ja die beiden service-Seite und der clientseitigen alle timeouts sind 1o Minuten.
  • Ich habe Gas von 1000 gleichzeitige Anrufe.
  • Mein Funktionsaufruf geht in Datenbank, und es gibt nur 3 Zeilen. Ich bin dem Aufruf schließen, nachdem diese Daten abgerufen und zurückgegeben.
  • ok, aber warum muss der stack-trace finden Sie AsyncComplete? Sync-Anrufe würden nicht werfen.
  • ^^^Ich nehme an, dass... ich weiß einfach nicht mehr daran erinnern, sehen, Async, es sei denn, ich mache Async
  • Ich nehme an, dies ist für die Bearbeitung von anrufen, die in asynchroner Weise. Ich habe verwendet InstanceContextMode = InstanceContextMode.PerCall auf meine service-code
  • Es ist nicht ungewöhnlich, um zu implementieren synchrone Aufrufe mit Ihre asynchronen Pendants ... solange du weißt, was du tust, es schlägt, schreiben die gleiche Funktion zweimal. Es ist nicht so, synchrone Aufrufe können nicht verwenden, ungleichzeitigkeiten-Sie müssen nur synchron sein. Wie Sie das tun => Implementierung detail.

InformationsquelleAutor ninja | 2014-01-26
Schreibe einen Kommentar