L'exception dans le service Web verrouille la DLL et empêche la publication.Solution de contournement?

StackOverflow https://stackoverflow.com/questions/35479

Question

J'utilise une DLL native (FastImage.dll) dans un service Web C# ASP.NET qui se verrouille parfois (impossible de la supprimer --- dit accès refusé) ;cela nécessite l'arrêt d'IIS pour supprimer la DLL.L'impossibilité de supprimer cette DLL dans le dossier bin de mon service Web publié m'empêche de publier avec succès (même s'il pense qu'elle a été publiée avec succès !), ce qui rend le développement et la correction du bug difficiles (surtout lorsqu'il exécute simplement l'ancien code depuis mon les modifications peuvent ne pas être reflétées sur le serveur !).Notez que le bug provoquant le bombardement et le verrouillage de la DLL par le service Web se trouve dans mon code, qui est en dehors de ladite DLL, donc je pense qu'il s'agit d'un problème plus général que la simple bibliothèque FreeImage (pour ne pas leur apporter de chaleur).

  1. Quelqu'un a-t-il vécu cela ?
  2. Existe-t-il un moyen de s'assurer que lorsqu'il est indiqué "Publication réussie" à partir du VS IDE, cela signifie vraiment cela, ou d'exécuter une sorte de script pour vérifier que les fichiers sont réellement supprimés avant de tenter de publier (comme une pré-construction étape dans VC++).(À l'heure actuelle, je supprime manuellement les fichiers avant de publier pour m'assurer que je sais que les DLL ont été remplacées, au lieu d'exécuter d'anciennes DLL.C'est toujours un problème, même si je ne parviens pas à supprimer la DLL.)
  3. Comment puis-je détecter si un fichier a été supprimé avec succès d’un fichier batch ?(afin que je puisse arrêter et démarrer IIS en cas d'échec)
  4. Est-il possible d'arrêter et de démarrer IIS à partir d'un script (de préférence depuis le panneau de publication...action dans le VS IDE) et si oui, comment ?
Était-ce utile?

La solution

L’utilisation de l’outil de ligne de commande IISReset redémarrera IIS uniquement sur la machine locale, et non sur un serveur distant sur lequel vous publiez.

En supposant que vous publiez sur un serveur Windows 2003, je vous suggère d'essayer l'étape légèrement moins radicale consistant à arrêter et redémarrer IIS AppPool dans le site Web ou le dossier virtuel dans lequel le service Web s'exécute.(De cette façon, vous ne mettez pas hors ligne tous les sites qui s'exécutent sur le serveur cible.) Cela suppose également que le service Web s'exécute dans son propre pool d'applications.Idéalement, cela devrait être le cas, vous le gardez donc isolé.

Je recommanderais de ne plus utiliser le processus de publication et d'envisager d'utiliser un projet de déploiement Web.Voici un article sur le blog de ScottGu détaillant Projets de déploiement Web VS 2005.

L'avantage de l'approche du projet de déploiement Web est qu'elle vous offre toute la puissance et les capacités de MSbuild, car il ne s'agit en réalité que d'un wrapper pratique autour de MSBuild.Voici un article de l'équipe MSBuild sur capacités de pré-construction et de post-construction

J'espère que cela t'aides.

Autres conseils

Vous pouvez utiliser l'outil de ligne de commande IISReset pour arrêter/redémarrer iis.Vous pouvez donc écrire un simple fichier batch pour arrêter iis, copier vos fichiers, puis redémarrer iis.Cependant, je ne sais pas comment intégrer cela à la fonctionnalité de publication VS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top