34 votes

quel est l'équivalent de global.asax Application_Start lorsque l'on utilise WAS dans IIS7

J'aimerais utiliser le netTcpBinding pour mon application WCF qui est actuellement hébergée dans IIS7, ce qui signifie la configurer pour utiliser WAS à la place. C'est assez simple, mais mon application utilisait auparavant l'événement Application_Start dans le fichier global.asax. Je n'ai pas besoin d'accéder au httpContext (dont l'accès a été supprimé dans IIS7, si j'ai bien compris), mais je voudrais quand même m'accrocher aux méthodes start ou init ?

Existe-t-il un équivalent lorsqu'on héberge une application dans WAS par rapport à IIS7 ?

L'utilisation du mode classique n'est pas une option (encore une fois, je ne suis pas intéressé par le contexte http et cela ne semble fonctionner que si l'on utilise une liaison http) - et j'ai vu un exemple de mise en place d'une classe statique dans le dossier app_code qui ressemble à un horrible hack.

26voto

Kev Points 60744

Je crois AppInitialize() est la méthode que vous recherchez. Voici un article sur son utilisation pour initialiser Castle Windsor dans un service WCF hébergé par WAS :

Castle Windsor et les services WCF sans protocole HTTP

L'essentiel de l'article est qu'au lieu d'utiliser Application_Start() qui ne sera pas appelé dans WAS :

protected void Application_Start(object sender, EventArgs e)
{
   var container = new WindsorContainer("ioc.config");
   DefaultServiceHostFactory.RegisterContainer(container.Kernel);
}

Utilisez :

public class InitialiseService
{
   /// <summary>
   /// Application initialisation method where we register our IOC container.
   /// </summary>
   public static void AppInitialize()
   {
      var container = new WindsorContainer("ioc.config");
      DefaultServiceHostFactory.RegisterContainer(container.Kernel);
   }
}

Pour citer Matt :

J'avoue que j'ai passé un moment à regarder l'Host Factory plus en détail, à chercher à envelopper le DefaultServiceHostFactory . Cependant, il semble une solution beaucoup plus simple, qui consiste à utiliser la méthode AppInitialize, peu documentée AppInitialize. Si vous créez une classe (n'importe quelle classe), et que vous la placez dans le répertoire ASP.NET App_Code dans votre projet et donnez-lui une signature de méthode comme défini ci-dessous, ce petit bébé sera déclenché exactement quand vous le voulez. Vous pouvez ensuite initialiser votre conteneur IoC dans ce dossier.

0 votes

Merci pour la réponse. Je suis tombé sur ce système, mais il semble plutôt "bricolé", pour le dire légèrement... Je ne pensais vraiment pas devoir me fier au dossier app_code ..... N'y a-t-il vraiment pas d'autre solution de remplacement ?

0 votes

Mais il semble qu'il soit ignoré par VS Web Server (aka Casini, ASP.NET Dev Server).

0 votes

@abatishchev - Qu'en est-il avec IIS Express ?

13voto

grahamesd Points 619

AppInitialize est une méthode valide pour initialiser votre service. Mais il existe d'autres méthodes qui pourraient mieux fonctionner pour vous et qui sont décrites dans cet article : Comment initialiser les services WCF hébergés

NOTE : le lien original a disparu. Le lien ci-dessus renvoie à une copie sur archive.org.

0 votes

Merci Graham - Je n'ai pas eu l'occasion de regarder ce morceau de code pour le valider, mais l'article semble être une meilleure option que d'avoir à compter sur les autres solutions bricolées.

0 votes

Application_Start en exécute un pour l'ensemble de l'application. L'utilisation d'une usine de services, comme le mentionne votre lien, ne s'exécuterait qu'une fois par service. Vous auriez donc besoin d'une logique supplémentaire pour empêcher votre code de s'exécuter deux fois.

0 votes

@grahamesd lien mentionné dans cette réponse n'est pas trouvé 404 page est à venir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X