2010-12-01 5 views
1

J'ai un service WCF hébergé dans IIS, ce service génère un fichier XML en utilisant le code suivant:Comment libérer la poignée de fichier par aspnet_wp.exe

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(); 
} 

Une fois le fichier XML est écrit sur le disque, si J'essaye de changer le contenu du dossier OU si j'essaye de supprimer le dossier, j'obtiens le message d'erreur que le dossier est employé par un autre processus, fermez tous les programmes utilisant le dossier. J'ai téléchargé une application appelée "ofview" qui montre quel processus contient un handle sur le fichier et le verrouille. Cela montre qu'aspnet_wp détient le verrou sur le fichier XML. ofview me permet de libérer cette poignée, alors je peux changer le fichier ou le supprimer.

Ma question est: comment puis-je libérer le handle par programmation, une fois que j'ai fini d'écrire le fichier dans mon code? Est-ce que je manque quelque chose? Merci de votre aide.

+0

Je pense que le problème est dans IIS - que nous utilisions Enterprise Library Caching block, et il a souffert du même problème - les fichiers journaux n'ont pas pu être ajoutés, et des dizaines de nouveaux fichiers ont été créés (vraiment frustrant). Nous sommes donc passés à log4net qui n'a pas ce problème. Essayez de regarder dans différentes méthodes pour verrouiller le fichier - regardez dans le code log4net si vous avez le temps ... btw, quel IIS utilisez-vous? – veljkoz

+0

J'utilise IIS version 5.1 –

Répondre

0

Si vous avez juste le code que vous avez posté, le handle de fichier est réellement libéré immédiatement après que vous appelez textWriter.Close() - essayez de mettre ce même code par lui-même dans un projet fictif et faites un pas dans l'exécution. Vous devriez recevoir une erreur en essayant de supprimer le fichier juste avant que textWriter.Close() soit appelé, mais devrait pouvoir supprimer le dossier juste après textWriter.Close().

Y a-t-il d'autres E/S dans votre service?

EDIT

Pas sûr que cela aiderait, mais vous pouvez essayez de vider le flux avant l'appel près:

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

J'ai utilisé le même code dans une application de console et est passé par pas et il n'y avait pas de problèmes. Je peux supprimer le fichier après l'appel de Close. Si j'essaie de supprimer avant de fermer, cela donne l'erreur qu'un autre processus a un handle dessus. Bien sûr, puisque c'était une application console aspnet_wp n'a rien à voir avec ça. –

+0

Sur le service WCF, j'ai ajouté Flush, puis appelé Close, n'a fait aucune différence. J'ai toujours le même problème. Oui, j'ai plus d'E/S dans le service. Le service écrit 3 fichiers de cette manière. Je ne peux pas supprimer n'importe lequel d'entre eux puisque aspnet_ws a un handle dessus. –

+0

Accordé le test est dans une application de console et le problème est dans aspnet_wp, mais c'est toujours le même code et le même moteur qui l'exécute. Si j'étais vous, je créerais un service factice avec juste le code ci-dessus. Si vous pensez vraiment que le code que vous avez fourni est celui où le problème est, votre service simplifié/délesté devrait donner la même difficulté sans le reste de la complexité de votre service actuel. Une autre chose que vous pouvez faire est d'envoyer des demandes identiques à votre service - si votre première demande n'a pas fermé le fichier correctement, la deuxième requête ne pourra pas accéder au fichier. – bitxwise

Questions connexes