c# wcf - Ausnahme beim aufrufen von open() auf proxy-Klasse
Ich habe Folgendes problem, ich habe einen WCF-Dienst und die funktioniert Prima in kleinen tests. Jedoch wenn ich versuche eine batch/laden, test, bekomme ich eine InvalidOperationException
mit der Meldung angezeigt, wenn die open () - Methode wird aufgerufen, auf dem die proxy-Klasse:
"Auf dem Kommunikationsobjekt "System".ServiceModel.- Kanäle.ServiceChannel nicht geändert werden, während es im Geöffneten Zustand."
Ich habe google gesucht, aber nicht finden können, jemand anderes wirklich zitieren dieses Ausnahme-Nachricht.
Ich denke, dass einige weitere Informationen über den service kann notwendig sein, für eine Diagnose - wenn der service empfängt Daten über seine offen gelegten Methoden, die im Grunde führt einige Verarbeitung und leitet die Daten an einen Dienst im Zusammenhang mit den Daten (unterschiedliche Daten in unterschiedliche routing). Um sicherzustellen, dass der Dienst ausgeführt wird, so schnell wie möglich, in jedem Zyklus der Entgegennahme, Verarbeitung und Weiterleitung der Daten erfolgt durch einen separaten thread im threadpool. könnte das ein problem sein, sich aus einem thread aufrufen proxyClass.Open()
während ein anderer schon es zu benutzen? würde ein lock
blockieren beseitigen dieses problem, wenn ja ist dies das problem?
danke Leute, - habe ich workikng dieses Projekt für zu lange, und endlich sehen wollen, dass die Rückseite der es - aber dies scheint der Letzte Stolperstein, so dass jede Hilfe sehr geschätzt 🙂
=========================================================================
Dank für die Hervorhebung, dass ich nicht die sein, mit der using
Konstrukt für WCF-proxy-Klassen. Aber in dem MSDN-Artikel ist das nicht die klar geschriebene Stück Literatur überhaupt, so dass, eine kurze Frage: sollte ich über einen proxy als solche:
try
{
client = new proxy.DataConnectorServiceClient();
client.Open();
//do work
client.Close();
}
.................. //catch more specific exceptions
catch(Exception e)
{
client.Abort();
}
- Teilen Sie den gleichen proxy-Objekt zwischen den threads?
- ja, es scheint, dass ich bin - und das ist, warum ich fragte über den lock-block...
- hi nick, ich aktualisiert mein Kommentar unten. Noch meine wenn über das Thema
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gehe ich davon aus, das Sie verwenden .NET 3.5 oder höher. In .NET 3.5, WCF ClientBase'1-Klasse (Basisklasse für die generierten client-proxies) wurde aktualisiert, um die Verwendung von zwischengespeicherten ChannelFactories/Kanäle. Folglich, es sei denn, du bist mit einer der Client-Nutzung/Erstellung von Strategien, die deaktiviert caching (Client-Konstruktor, in einem Binding-Objekt, oder den Zugriff auf ein paar bestimmte Eigenschaften, bevor das backing channel erstellt wird), obwohl Sie beim erstellen einer neuen Client-Instanz, könnte es sehr wohl immer noch mit dem gleichen Kanal. In anderen Worten, vor dem Aufruf .Open(), immer stellen Sie sicher, Sie überprüfen die .Status angelegt.
Wie bist du mit proxy? Die Schaffung neuer proxy-Objekt für jeden Aufruf. Fügen Sie einige code, in Bezug auf, wie Sie proxy benutzen.
Gewünschte Art und Weise der Verwendung von proxy ist für jeden Anruf erstellen Sie neue proxy-und entsorgen Sie es einmal abgeschlossen. Sie sind Aufruf von proxy.open() geöffnet für proxy, ist falsch. Es sollte nur einmal aufgerufen.
Versuchen Sie mit so etwas wie unten in endlich, da die wcf nicht über proxy fehlgeschlagen und es staut sich. Nicht sicher, ob es helfen würde, aber give it a shot.
Warum Sie dies tun?
http://msdn.microsoft.com/en-us/library/aa355056.aspx
Code, den Sie oben gepostet funktionieren würde, aber Sie werden immer Essen Ausnahme. So Griff wcf-bezogenen Ausnahme in einzelnen fangen und Ihre generischen catch ist mit Excelion würde Abbrechen, dann Ausnahme auslösen.
Auch wenn Sie immer noch wollen, verwenden Sie die Bequemlichkeit der using-Anweisung können Sie dann überschreiben dispose-Methode in Ihre proxy-und Entsorgung mit abort-Methode im Falle von wcf-Fehler.
Und müssen nicht anrufen .Open (), wie es geöffnet wird, wenn erforderlich, mit dem ersten Anruf.
Es klingt auf jeden Fall wie Sie genannt habe, Öffnen() mehrere Male auf das gleiche Objekt.
treffen wir die gleiche Straßensperre, wie Sie vor einiger Zeit.
Das Problem mit der using-Anweisung , ist, dass wenn Sie zu einem fehlerhaften Zustand ist, wird es noch versuchen, nahe an das Ende des Blocks. Ein weiterer Aspekt, der entscheidend war für uns, die Kosten für die Erstellung der proxy-everytime.
Wir haben viel gelernt aus dieser blog-Beiträge:
http://blogs.msdn.com/wenlong/archive/2007/10/26/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared.aspx
und
http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx
Hopefuly es wird Ihnen helfen, wie gut.
Cheers, Wagner.