Existe-t-il un moyen d'arrêter automatiquement le serveur de développement ASP.NET (Cassini) chaque fois que je compile/reconstruit dans VS2008 (et que, de toute évidence, il redémarre au besoin) ? Peut-être qu'il y a un paramètre de configuration caché quelque part? Ou au moins un moyen de le faire comme un événement de post-construction peut-être? Pour certaines raisons, le problème est que j'utilise Spring.NET pour l'injection de dépendances, etc., mais il charge ses singletons sur Application Start, ce qui signifie que si je change un code ou une configuration liée au ressort, je dois arrêter le Serveur de développement, de sorte qu'il recommence à nouveau le débogage/exécution en s'assurant que l'événement Application Start est à nouveau déclenché. En d'autres termes, même si vous changez un tas de code/config & puis recommencez le débogage, il ne commence pas à nouveau, car il est déjà en cours d'exécution, donc votre nouveau code n'est pas utilisé.Arrêter/redémarrer automatiquement le serveur de développement ASP.NET lors de la construction
Répondre
donc j'ai fini avec une solution à base de réponse Magnus, mais en utilisant la macro suivante relativement simple (pourquoi ils vous obligent à utiliser VB pour les macros je me sens tout sale?):
Imports System
Imports System.Diagnostics
Public Module KillCassini
Sub RestartDebug()
If (DTE.Debugger.DebuggedProcesses.Count > 0) Then
DTE.Debugger.Stop(True)
End If
KillCassini()
DTE.Debugger.Go(False)
End Sub
Sub KillCassini()
Dim name As String = "WebDev.WebServer"
Dim proc As Process
For Each proc In Process.GetProcesses
If (proc.ProcessName.StartsWith(name)) Then
proc.Kill()
End If
Next
End Sub
End Module
Fondamentalement si le débogueur est en cours d'exécution, il l'arrêtera & puis supprimera tous les processus nommés "WebDev.WebServer" qui devraient être toutes les instances de Cassini, puis redémarrera le débogueur (ce qui impliquera de nouveau implicitement Cassini). J'utilise proc.Kill()
parce que ni proc.CloseMainWindow()
ou proc.WaitForExit(1000)
semblait travailler ...
Quoi qu'il en soit, une fois que vous avez votre macro, vous pouvez l'assigner à des raccourcis clavier, ou créer des boutons personnalisés barre d'outils pour l'exécuter.
Note: modifié par un éditeur anonyme pour changer 'proc.ProcessName = name' en' proc.ProcessName.StartsWith (name) 'afin qu'il continue à fonctionner avec VS2010. – Alconja
Le seul moyen que je connaisse est de faire un démarrage personnalisé de Cassini sur l'événement post.build. Ce processus fait sur mesure tue toutes les instances de Cassini et en lance un nouveau. Pour que cela fonctionne, vous devez créer un petit utilitaire de ligne de commande personnalisé. Je l'ai appelé SpawnProcess ici.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Diagnostics;
namespace SpawnProc
{
class Program
{
public static void Main(string[] args)
{
if (args.Length > 0)
{
// Kill all current instances
FileInfo fi = new FileInfo(args[0]);
string name = Path.GetFileNameWithoutExtension(fi.FullName);
foreach (Process proc in Process.GetProcessesByName(name))
{
proc.Kill();
}
ProcessStartInfo startInfo = new ProcessStartInfo(args[0]);
if (args.Length > 1)
{
startInfo.Arguments += "/port:" + args[1];
}
if (args.Length > 2)
{
startInfo.Arguments += " /path:\"" + args[2].Trim(new char[]{'"'}) + "\"";
}
if (args.Length > 3)
{
startInfo.Arguments += " /vpath:\"" + args[3].Trim(new char[]{'"'}) + "\"";
}
try
{
Process.Start(startInfo);
}
catch (Exception ex)
{
Debug.WriteLine("Error: " + ex.Message);
for (int i = 0; i < args.Length; i++)
{
Debug.WriteLine("args[" + i + "]: " + args[i].ToString());
}
}
}
}
}
}
Ensuite, vous devrez demander à Visual Studio de ne pas utiliser Cassini. Accédez aux propriétés de votre application Web -> Web et sélectionnez "Utiliser un serveur Web personnalisé", entrez quelque chose comme: http://localhost:1685/
(ou quel que soit le numéro de port que vous souhaitez utiliser). Ensuite, entrez cette commande en cas de post-construction:
"$(ProjectDir)..\SpawnProc\bin\debug\SpawnProc" "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.exe" 1685 "$(ProjectDir)"/
Assurez-vous que vos chemins est correct, par exemple, depuis que je suis en cours d'exécution d'un système d'exploitation 64 bits, mes fichiers de programme chemin est différent d'un OS 32 bits. En outre, mon SpawnProc.exe est dans un sous-projet.
Merci Magnus, même si je n'ai pas utilisé votre solution exacte, j'ai utilisé l'idée de créer une macro, ce qui est un peu plus simple pour moi. – Alconja
@Kiquenet, pouvez-vous s'il vous plaît élaborer sur votre édition? Pourquoi pensez-vous qu'il existe un besoin pour un nom de domaine complet pour un environnement de développement local avec Cassini qui ne fonctionne que pour localhost de toute façon? –
@Sorry, vous m'avez complètement perdu. Je le change à Localhost. –
Activation "Modifier & Continuer" sur le projet de serveur Web a fonctionné pour moi. Il n'arrête pas Cassini lorsque vous arrêtez le débogage, mais il redémarre Cassini lorsque vous démarrez le débogage.
Belle (et simple) solution. Je vais continuer à utiliser ma macro maintenant il est déjà écrit et me donne un contrôle plus fin, mais c'est toujours bon à savoir. Merci. – Alconja
sur Visual Studio 2008, il ferme également le serveur Web à l'arrêt de débogage – Jaguar
Sur Visual Studio 2010, il fait aussi bien. (Il n'efface pas l'icône de la zone de notification tant que vous n'avez pas survolé l'icône.) –
Inspiré par ce message et un autre about code clean up J'ai ajouté la macro comme PostDebug-event. Ainsi, chaque fois que le débogueur revient, il supprimera tous WebDev.WebServer-s. (Et je me suis détendu la ProcessName-contrainte.)
Note: cela va probablement tuer tous les serveurs Web, donc aussi d'autres serveurs Web debug-sessions (ce qui est bien avec moi, à ce moment-là, je le fais habituellement pas en avoir).Donc, vous voudrez peut-être seulement rechercher des processus enfants ou quelque chose comme ça (et publiez ce code ici ;-)).
donc mon code ressemble à ceci:
Private Sub DebuggerEvents_OnEnterDesignMode(ByVal Reason As EnvDTE.dbgEventReason) _
Handles DebuggerEvents.OnEnterDesignMode
If (Reason = dbgEventReason.dbgEventReasonStopDebugging) Then
Dim name As String = "WebDev.WebServer"
Dim proc As System.Diagnostics.Process
For Each proc In System.Diagnostics.Process.GetProcesses()
If (proc.ProcessName.StartsWith(name)) Then
proc.Kill()
End If
Next
End If
End Sub
La meilleure solution pour cela, à mon avis. – Tim
Je viens d'ouvrir une ligne de commande (runas admin)
exécutez la commande suivante. Il faut tous les tuer
Taskkill /IM WebDev.WebServer40.EXE /F
Une autre façon utilise Powershell:
- comme pre-build-event:
powershell Stop-Process -name webdev.webserver
- comme Powershell-command-shortcut:
powershell.exe Stop-Process -Name @('WebDev.WebServer*', 'Microsoft.Expression.Web*')
PS: Je ne sais pas si tout le monde est toujours dans le besoin, mais j'ai couru accidentellement dans cette solution, tout en cherchant quelque chose de complètement différent.
- 1. Serveur de développement ASP.NET inaccessible
- 2. Serveur de développement Web ASP.NET
- 3. D'où le serveur de développement ASP.NET obtient-il ses images?
- 4. ASP.NET Crash du serveur de développement
- 5. Serveur de développement ASP.NET - 403 interdit
- 6. Ouverture serveur de développement ASP.net au monde
- 7. jQuery trop lent avec le serveur de développement Asp.Net
- 8. Arrêter le serveur de développement lorsque j'arrête le débogage
- 9. à l'étape automatiquement dans le serveur lors du débogage WCF
- 10. Serveur SMTP de développement
- 11. sgen.exe échoue lors de la construction
- 12. ChatFx Lite LicenseException sur le serveur de construction
- 13. Créer un moniteur pour le serveur de construction TFS 2008
- 14. serveur de développement asp.net + problème FF. IE OK
- 15. Dépendances manquantes lors de la construction de CruiseControl
- 16. Impossible de lancer le serveur de développement ASP.NET parce que le port '1900' est utilisé
- 17. Impossible d'établir la connexion sur le serveur Web de développement ASP.NET local?
- 18. Retarder la signature pendant le développement et non sur le serveur de build
- 19. Comment forcer l'authentification Windows avec le serveur de développement asp.net local?
- 20. Serveur de développement de tests de stress/serveur de production
- 21. Comment prendre le contrôle de la construction d'un WebService
- 22. contrôles asp.net pour le développement de l'iPhone
- 23. Serveur de portail léger pour le développement de WebSphere Portal?
- 24. Développement iPhone - Le clavier ne s'ajuste pas automatiquement lors de la saisie en utilisant TextField placé dans un TableView
- 25. Comment faire fonctionner le serveur de développement ASP.NET sur le port 80?
- 26. Mac développement - la construction d'une application avec la barre d'outils
- 27. Erreurs de liaison lors de la construction avec Core Plot
- 28. Automatisation de la construction locale?
- 29. Configurer des références de serveur de développement
- 30. Google App Engine - différences entre le serveur de développement et le serveur de production
Je serais curieux de savoir pourquoi vous en avez besoin sans l'arrière-plan que vous avez fourni. :) Je ne peux pas aider de toute façon. –
J'ai le même désir mais un problème très différent. Mon application Web possède des dépendances natives (pilotes de base de données) et notre build les copie dans le répertoire de sortie. (Les wrappers .NET autour des pilotes ont des liens statiques avec les DLL natives, ce qui nous permet de les placer dans le répertoire 'bin' Croyez-moi, c'est une bien meilleure solution que d'essayer d'installer le client Oracle.) Malheureusement, le serveur de développement verrouille les DLL natives, donc les copier échoue pendant la construction. C'est très frustrant d'avoir à arrêter manuellement le serveur web chaque fois que j'ai besoin de reconstruire. – jpmc26