Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

[erledigt] WCF - Aufruf e. ext. Prozesses in e. Service Methode sorgt für fault beim nächsten Aufruf
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

[erledigt] WCF - Aufruf e. ext. Prozesses in e. Service Methode sorgt für fault beim nächsten Aufruf

beantworten | zitieren | melden

Moin zusammen,

ich habe einen WCF service mit wsHttpBinding und Message Security.

Bislang funktionierte alles wunderbar.

Nun rufe ich in einer Methode des Service eine exe auf:

                using (var proc = new Process())
                {
                    proc.EnableRaisingEvents = false;
                    proc.StartInfo.FileName = Path.Combine(exePath, "ex.exe");
                    proc.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\"", sourceFile, destFile);
                    proc.StartInfo.RedirectStandardError = true;
                    proc.StartInfo.UseShellExecute = false;
                    proc.Start();
                    if (!proc.WaitForExit(10000 + (int)Math.Min(filesize / 50L, 600000L)))
                    {
                        proc.Kill();
                        Thread.Sleep(1000);
                        throw new Exception("Timeout");
                    }
                    using (var errorReader = proc.StandardError)
                    {
                        var error = errorReader.ReadToEnd();
                        if (!string.IsNullOrEmpty(error)) throw new Exception(error);
                    }
                }
Das funktioniert auch wunderbar. Ich werte das Ergebnis aus liefere es zurück...
Bei dem nächsten Aufruf einer (anderen) Methode des Services bekomme ich allerdings eine FaultException mit der folgenden Fehlermeldung:
Fehler
Die Nachricht konnte nicht verarbeitet werden. Wahrscheinliche Ursache: Die Aktion "..." ist falsch ist, die Nachricht enthält ein ungültiges oder abgelaufenes Sicherheitskontexttoken oder zwischen Bindungen besteht ein Konflikt. Das Sicherheitskontexttoken wäre ungültig, wenn der Dienst den Kanal aufgrund von Inaktivität abgebrochen hätte. Erhöhen Sie das Empfangszeitlimit für die Bindung des Dienstendpunkts, um zu verhindern, dass der Dienst Leerlaufsitzungen vorzeitig abbricht.

Unter InnerException.Code.SubCode.Name steht BadContextToken.

Wenn ich den obigen Code auskommentiere läuft alles wie es soll.

Hat jemand eine Idee, wieso der (erfolgreiche) Aufruf eines externen Prozesses in einer Service Methode dafür sorgt, dass der Kanal "gefaulted" wird?

Gruß
T-Man
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Man am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

ich tippe - nur so vom Gefühl her - darauf dass der Process zu lange braucht und somit ein TimeOut (wenn auch nur ein internes) kommt. Probier mal einen sehr kurzen Prozess zu starten (zB eine leer static void Main). Wenn hier das Problem nicht auftritt liegst wohl an der Eingangs erwähnten Vermutung.


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Danke, Ich denke, Du hattest den richtigen Riecher. Wenn ich eine exe aufrufe, die gar nichts tut, klappt es.

Aber was ist ein internes Timeout (im Gegensatz zum Timeout das sofort eine Exception im Client erzeugt)? An welcher Schraube muss ich da drehen?
Der Prozess braucht übrigens ca 1 sec und ich sehe in den app.- und web.config Dateien keine Timeouts, die kleiner als 10sec sind.

Und wie kann es einen Timeout geben, wenn doch die Methode erfogreich beendet wird?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
Und wie kann es einen Timeout geben, wenn doch die Methode erfogreich beendet wird?
Die Methode wartet hauptsächlich und das wird wohl von WCF als Leerlaufsitzung (siehe letzten Satz in der Fehlermeldung) gedeutet. Angenommen meine "Theorie" stimmt gibt es mindestens zwei Möglichkeiten die relativ leicht umzusetzen sind:
  • Erhöhen Sie das Empfangszeitlimit für die Bindung des Dienstendpunkts (aus Fehlermeldung übernommen)
  • auf das Process-Ende per Polling zu warten

Wenn das alles nicht hilft dann würde ich den Service als Asynchronous Operations implementiert und wenn das auch nicht hilft mit Events and Callbacks.


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Ich habe nun in die exe, die nichts tut ein Thread.Sleep(2000) eingebaut. Das dauert eindeutig länger als das Ausführen der anderen exe und ich bekomme den Fehler nicht. Es liegt also nicht an der Dauer. Es muss mit der exe zu tun haben. Die muss noch irgendwelche Nachwirkungen haben, aber wie kann das sein?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

bau die EXE mal mit Dummy-Implementierungen nach. Also das was sie tut mit minimalster Art durchführen lassen - verstehst du was ich meine? So kann das (seltsame) Verhalten eingegrenzt werden.


BTW: Weil ich es gerade sehe: Wirf im Service keine Exception sondern eine FaultException -> WCF weiß dann besser wie es damit umgehen soll.


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Leider ist die exe 'ne externe. Ich kenne den Aufbau nicht. Sie extrahiert den Volltext aus einer Datei und schreibt ihn in eine andere Datei. Ob sie dafür Hintergrundprozesse startet etc. weiß ich nicht, das müsste ich den Hersteller fragen...

Ich denke, ich muss das ganze asynchron laufen lassen.

Die Exception fange ich übrigens noch im Service wieder ab, daher keine FaultException.

Danke für Deine Antworten
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

bzgl. Exception: dann passt es - wollte nur darauf Hinweisen ;-)
Zitat
Sie extrahiert den Volltext aus einer Datei und schreibt ihn in eine andere Datei.
Stell das mal mit einer eigenen EXE nach. Einfach File.ReadAllText und File.WriteAllText. Wenn das klappt wissen wir mehr - zumindest kann so die Ursache eingegrenzt werden.
Das würde ich noch vor dem async. probieren - es ist ja nicht mit Sicherheit zu sagen dass es dort funktioniert ;-)


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Habe es mit

        static void Main(string[] args)
        {
            File.WriteAllText(args[1], File.ReadAllText(args[0]));
        }
nachgebaut und bekomme den Fehler nicht.

Die Anzahl der Prozesse ist vor und nach dem Aufruf der original exe übrigens gleich. Die Aufgerufene exe erzeugt also wohl keine neuen Prozesse, die hinterher noch laufen und zu Problemen führen könnten...

Der Unterschied zwischen meiner und der original exe ist u.a., dass meines ein .net Programm ist, während die andere in c++ programmiert wurde.

Noch Ideen?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

das Probleme wäre somit mal eingegrenzt, aber die Wurzel lässt sich ja nicht beseitigen. Wirkliche Ideen hab ich dazu nicht - außer dem was oben schon alles steht: async, events, usw.

Merkwürdig ist es halt ein wenig dass deine exe geht, die andere aber nicht


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Ich habe jetzt das Problem. Die fremde exe erzeugt neben sich eine Datei.
Wenn ich das mit einer eigenen nachbilde, bekomme ich den selben Fehler.
Scheinbar wird der Service vom IIS neu gestartet sobald in einem Unterverzeichnis neue Dateien entstehen. Kann man das dem IIS abgewöhnen?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

super - du kommst der Lösung immer näher!

Beim IIS kenn ich mich zuwenig aus, aber kann nicht die exe in ein nicht-IIS-Verzeichnis verschoben werden wo das egal ist (Anwendungdaten zB)? Im Service braucht dann nur der Pfad angepasst werden.


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 210
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Genau so werde ich es machen!
private Nachricht | Beiträge des Benutzers