2009-07-28 5 views
3

Dans une application .NET Windows pour modifier un fichier de configuration de machine distante utilisé par une application ASP.NET. Cependant, je continue à obtenir l'erreur:Puis-je arrêter un IIS?

System.IO.IOException: The process cannot access the file '[file name]' because it is being used by another process.

Maintenant, cela peut ne pas être le problème, mais je comprendre que si je peux arrêter l'IIS, je peux modifier le fichier de configuration de la machine (sans obtenir l'exception), puis je peux redémarrer IIS en utilisant ce code:

Process proc = new Process(); 
      proc.EnableRaisingEvents = false; 
      proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      proc.StartInfo.FileName = "iisreset"; 
      proc.StartInfo.Arguments = serverName; 
      try 
      { 
       proc.Start(); 
       proc.WaitForExit(); 
       ... 

1) y at-il un moyen d'arrêter l'IIS sans redémarrer, et 2) Doe cette approche pour changer le server.config fichier a même du sens?

(note, je suis en train de modifier le fichier avec des expressions régulières rechercher et remplacer, est-ce un problème?)

+2

1) tapez 'IISRESET /?' Sur la ligne de commande –

+0

Désolé, j'ai oublié de spécifier qu'il s'agit d'une config de machine distante. – thewillcole

Répondre

7

Vous devriez être capable de faire quelque chose comme ça. Je n'ai pas de fenêtres, donc je ne peux pas vérifier le nom exact du service, mais je pense que c'est "IISADMIN" ou "w3svc". Souvenez-vous que ceci devrait être le nom du service et non le nom d'affichage que vous voyez dans le panneau de commande de service.

ServiceController controller = new ServiceController(); 
controller.MachineName = "."; // or the remote machine name 
controller.ServiceName = "IISADMIN"; // or "w3svc" 
string status = controller.Status.ToString(); 

// Stop the service 
controller.Stop(); 

// Start the service 
controller.Start(); 

Vous pouvez également utiliser

net stop w3svc

ou

net stop IISADMIN

de la ligne de commande ou dans votre processus dans votre code

+2

Je pense que 'w3svc' est meilleur dans ce cas, car cela ne fera qu'arrêter le serveur web. L'arrêt de IISADMIN arrêtera également d'autres services, comme ftp et smtp. – fretje

+0

oui, je pense que vous corrigez, désolé, je n'ai pas de fenêtres pour vérifier ce –

+0

mais le fichier de configuration peut encore être verrouillé par le service d'administration, il vous suffit de vérifier –

2

Vous pouvez utiliser la commande IISRESET /STOP.

Si vous tapez IISRESET /? vous obtiendrez une liste d'autres options disponibles.

[Edit:. Faites passer le commutateur "/ STOP" comme la propriété des arguments sur le processus startinfo objet]

4

étrange. Un fichier .config ne doit pas être verrouillé exclusivement.
Mais pour répondre à votre question, vous pouvez également utiliser la commande net pour cela:

net stop w3svc 

pour arrêter le service www et

net start w3svc 

pour le lancer à nouveau.

Vous pouvez aussi le faire par programme tel que décrit par @monkeyp

Remarque que je vous conseille contre cela et d'abord essayer de déterminer (et résoudre) la cause de la serrure comme décrit par @RichardOD.

0

Vous pouvez souvent simplement recycler ou arrêter/démarrer le IIS Application Pool est en cours d'exécution, plutôt que de redémarrer complètement IIS.

2

Devrait être "iisreset/STOP" pour arrêter les services, puis "iisreset/START" pour les redémarrer.

2

Utilisez un outil comme wholockme or unlocker pour trouver la cause racine du verrouillage.

Mise à jour - une autre option est d'utiliser Process Explorer (merci fretje) - c'est une bonne option car beaucoup de développeurs ont cet utilitaire sur leur PC.

+2

ou l'explorateur de processus – fretje

+0

Merci- Je mettrai à jour ma réponse. – RichardOD

0
Using System.Diagnostics; 

//to stop ISS 
ProcessStartInfo startInfo = new ProcessStartInfo("iisreset.exe", " /stop"); 
System.Diagnostics.Process.Start(startInfo); 

//to start ISS 
ProcessStartInfo stopInfo = new ProcessStartInfo("iisreset.exe", " /start"); 
System.Diagnostics.Process.Start(stopInfo); 
Questions connexes