2010-12-01 2 views
1

Ich habe einen WCF-Dienst in IIS gehostet wird, erzeugt dieser Dienst eine XML-Datei mit dem folgenden Code:Wie durch aspnet_wp.exe Datei-Handle freizugeben

XmlSerializer serializer = new XmlSerializer(typeof(Batch)); 
using (TextWriter textWriter = new StreamWriter(ConfigurationManager.AppSettings["SFTPDirectoryPath"] + "\\" + bundle.Name.Replace("dat", "xml"))) 
{ 
    serializer.Serialize(textWriter, batch); 
    textWriter.Close(); 
} 

Nachdem die XML-Datei auf der Festplatte geschrieben wird, wenn Ich versuche, den Inhalt der Datei zu ändern ODER wenn ich versuche, die Datei zu löschen, erhalte ich die Fehlermeldung, dass die Datei von einem anderen Prozess verwendet wird, schließe alle Programme, die die Datei verwenden. Ich habe eine App namens "ofview" heruntergeladen, die anzeigt, welcher Prozess die Datei handhabt und sie schließt. Es zeigt, dass aspnet_wp die Sperre für die XML-Datei hält. Ofview ermöglicht es mir, dieses Handle zu veröffentlichen, dann kann ich die Datei ändern oder löschen.

Meine Frage ist: Wie kann ich das Handle programmgesteuert freigeben, nachdem ich die Datei in meinem Code geschrieben habe? Fehle ich etwas? Danke für Ihre Hilfe.

+0

denke ich, das Problem in der IIS - wir Enterprise Library wurden mit Zwischenspeichern Block, und es erlitt das gleiche Problem - die Protokolldateien konnten nicht angefügt werden, und Dutzende neue Dateien wurden erstellt (wirklich frustrierend). Also sind wir zu log4net gewechselt, das dieses Problem nicht hat. Versuchen Sie, verschiedene Methoden zu untersuchen, um die Datei zu sperren - schauen Sie in den log4net-Code, wenn Sie Zeit haben ... Übrigens, welche IIS verwenden Sie? – veljkoz

+0

Ich verwende IIS Version 5.1 –

Antwort

0

Wenn Sie nur den von Ihnen geposteten Code haben, wird das Dateihandle tatsächlich sofort nach dem Aufruf textWriter.Close() freigegeben - versuchen Sie, denselben Code selbst in ein Dummy-Projekt einzufügen und durchlaufen Sie die Ausführung. Sie sollten einen Fehler erhalten, wenn Sie versuchen, die Datei zu löschen, bevor textWriter.Close( aufgerufen wird, aber in der Lage sein sollte, die Datei direkt nach textWriter.Close() zu löschen.

Gibt es noch andere E/A in Ihrem Dienst?

EDIT

Nicht sicher, ob dies helfen würde, aber man könnte versuchen, den Strom vor dem Ende Anruf Spülung:

serializer.Serialize(textWriter, batch); 
textWriter.Flush(); 
textWriter.Close(); 
+0

Ich habe den gleichen Code in einer Konsole App und trat durch und es gab keine Probleme. Ich kann die Datei löschen, nachdem der Close aufgerufen wurde. Wenn ich versuche, vor Close zu löschen, gibt es den Fehler, dass ein anderer Prozess ein Handle darauf hat. Natürlich, da dies eine Konsolen-App war, hat aspnet_wp nichts damit zu tun. –

+0

Auf dem WCF-Dienst habe ich Flush hinzugefügt und dann Close genannt, was keinen Unterschied machte. Trotzdem habe ich das gleiche Problem. Ja, ich habe mehr I/O im Dienst. Der Dienst schreibt 3 Dateien auf diese Weise. Ich kann niemanden von ihnen löschen, da aspnet_ws einen Griff darauf hat. –

+0

Zugegeben, der Test ist in einer Konsolenanwendung und das Problem ist in aspnet_wp, aber es ist immer noch der gleiche Code und die gleiche Engine, die es ausführt. Wenn ich Sie wäre, würde ich mit dem obigen Code einen Dummy-Service erstellen. Wenn Sie der Meinung sind, dass der von Ihnen bereitgestellte Code das Problem ist, sollte Ihr vereinfachter/verdunkelter Dienst die gleiche Schwierigkeit ohne den Rest der Komplexität Ihres aktuellen Dienstes bieten. Sie können auch identische Anfragen an Ihren Dienst zurücksenden - wenn Ihre erste Anfrage die Datei nicht ordnungsgemäß geschlossen hat, kann die zweite Anfrage nicht auf die Datei zugreifen. – bitxwise

Verwandte Themen