Événement de démarrage d’application WCF

Quelle est la meilleure façon d’être averti lorsqu’un service WCF est démarré pour la première fois?

Y a-t-il quelque chose de similaire à la méthode Application_Start dans Global.asax pour une application ASP.NET?

Eh bien, cela peut être un peu délicat, car la façon préférée d’appeler les services WCF est “par appel”, par exemple, vous n’avez vraiment rien de “démarré” et vous ne faites que vraiment traîner.

Si vous hébergez votre service dans IIS ou WAS, c’est même le “chargement à la demande” de votre hôte de service – lorsqu’un message arrive, l’hôte est instancié et gère la demande.

Si vous hébergez vous-même, vous avez soit une console ou une application Winforms – vous pouvez donc vous y connecter pour savoir quand elles démarrent. Si vous disposez d’un service Windows pour héberger votre hôte de service, vous avez probablement la priorité sur les méthodes OnStart et OnStop de la classe ServiceBase ->.

La question est plus: qu’est-ce que vous essayez exactement d’accomplir? Simplement vous connecter ou quelque chose comme ça, ou voulez-vous que quelque chose rest en mémoire?

Marc

Comme il ne s’agit que d’une classe, vous pouvez utiliser un constructeur statique qui sera appelé la première fois que Type est utilisé.

public Service : IContract { public Service(){ // regular constructor } static Service(){ // Only called first time it's used. } } 

J’ai utilisé ce lien, il existe plusieurs solutions: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

Vous pouvez toujours append manuellement des fichiers global.asax à votre application de service WCF pendant son hébergement sur IIS et l’intégrer au pipeline ASP.NET:

 < %@ Application Codebehind="Global.asax.cs" Inherits="WcfApplication" Language="C#" %> public class WcfApplication : HttpApplication { protected void Application_Start() { } } 

Si vous avez un service WCF auto-hébergé, vous pouvez append un événement à l’ouverture du service, et à l’intérieur de cet événement, vous pouvez affecter une variable statique, tout comme cet article:

 //Static Variables in a WCF Service public class Post2331848 { [ServiceContract] public interface ITest { [OperationContract] ssortingng GetSsortingng(); } public class Service : ITest { public static ssortingng TheSsortingng; public ssortingng GetSsortingng() { return TheSsortingng; } } static void host_Opening(object sender, EventArgs e) { Service.TheSsortingng = "This is the original ssortingng"; } public static void Test() { ssortingng baseAddress = "http://" + Environment.MachineName + ":8000/Service"; ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); //This is the magic line! host.Opening += new EventHandler(host_Opening); host.Open(); Console.WriteLine("Host opened"); Console.ReadLine(); host.Close(); } } 

(Original de http://www.eggheadcafe.com/community/aspnet/18/10162637/help-in-maintain-global-variable-in-wcf.aspx )

Bonne chance!

 Imports System.ServiceModel Imports System.ServiceModel.Description Public Class MyServiceHost Inherits Atsortingbute Implements IServiceBehavior Public Sub AddBindingParameters(serviceDescription As System.ServiceModel.Description.ServiceDescription, serviceHostBase As System.ServiceModel.ServiceHostBase, endpoints As System.Collections.ObjectModel.Collection(Of System.ServiceModel.Description.ServiceEndpoint), bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements System.ServiceModel.Description.IServiceBehavior.AddBindingParameters End Sub Public Sub ApplyDispatchBehavior(serviceDescription As System.ServiceModel.Description.ServiceDescription, serviceHostBase As System.ServiceModel.ServiceHostBase) Implements System.ServiceModel.Description.IServiceBehavior.ApplyDispatchBehavior AddHandler serviceHostBase.Opened, AddressOf serviceHostBase_Opened AddHandler serviceHostBase.Closed, AddressOf serviceHostBase_Closed End Sub Public Sub Validate(serviceDescription As System.ServiceModel.Description.ServiceDescription, serviceHostBase As System.ServiceModel.ServiceHostBase) Implements System.ServiceModel.Description.IServiceBehavior.Validate End Sub #Region "Event Handlers" Private Sub serviceHostBase_Opened(ByVal sender As Object, ByVal e As EventArgs) End Sub Private Sub serviceHostBase_Closed(ByVal sender As Object, ByVal e As EventArgs) End Sub #End Region 

L’API ServiceHost standard pour l’hébergement de services dans Windows Communication Foundation (WCF) est un point d’extensibilité dans l’architecture WCF. Les utilisateurs peuvent dériver leurs propres classes hôtes à partir de ServiceHost, généralement pour remplacer OnOpening afin d’utiliser ServiceDescription pour append impérativement des points de terminaison par défaut ou pour modifier les comportements, avant d’ouvrir le service.

http://msdn.microsoft.com/en-us/library/aa702697%28v=vs.110%29.aspx

Il existe un package nuget appelé WebActivator que j’ai trouvé utile pour l’hébergement IIS.

https://www.nuget.org/packages/WebActivatorEx/

Vous ajoutez des atsortingbuts d’assemblage à votre projet WCF.

 [assembly: WebActivatorEx.PreApplicationStartMethod ( typeof(MyActivator), "Start") ] public static class MyActivator { public static void Start() { // do stuff here } }