Событие запуска приложения WCF

Каков наилучший способ получить уведомление при первом запуске службы WCF?

Есть ли что-то похожее на метод Application_Start в приложении Global.asax для приложения ASP.NET?

Это может быть немного сложно, поскольку предпочтительный способ вызова служб WCF – это «за вызов», например, у вас на самом деле нет ничего, что было бы «запущено», а затем просто зависало.

Если вы размещаете свою службу в IIS или WAS, это даже «по требованию» загрузка вашего хоста-службы – когда приходит сообщение, узел создается и обрабатывает запрос.

Если вы используете самообслуживание, у вас есть консоль или приложение Winforms, поэтому вы можете зайти туда, чтобы узнать, когда они начнутся. Если у вас есть служба Windows для размещения вашего хоста, вы, скорее всего, переопределите методы OnStart и OnStop в classе ServiceBase -> hook.

Вопрос в том, что именно вы пытаетесь достичь? Просто регистрироваться или что-то в этом роде, или вы хотите, чтобы что-то заработало в памяти, чтобы придерживаться?

Марк

Поскольку это просто class, вы можете использовать статический конструктор, который будет называться при первом использовании Type.

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

Я использовал эту ссылку, есть несколько решений: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

Вы всегда можете вручную добавлять файлы global.asax в свое приложение-службу WCF, поскольку оно размещено в IIS и интегрируется с конвейером ASP.NET:

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

Если у вас есть Self-Hosted WCF Service, вы можете добавить событие к открытию службы, и внутри этого события вы можете назначить статическую переменную, как и этот пост:

 //Static Variables in a WCF Service public class Post2331848 { [ServiceContract] public interface ITest { [OperationContract] string GetString(); } public class Service : ITest { public static string TheString; public string GetString() { return TheString; } } static void host_Opening(object sender, EventArgs e) { Service.TheString = "This is the original string"; } public static void Test() { string 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(); } } 

(Исходно из http://www.eggheadcafe.com/community/aspnet/18/10162637/help-in-maintain-global-variable-in-wcf.aspx )

Удачи!

 Imports System.ServiceModel Imports System.ServiceModel.Description Public Class MyServiceHost Inherits Attribute 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 

Стандартный API ServiceHost для хостинга в Windows Communication Foundation (WCF) является точкой расширения в архитектуре WCF. Пользователи могут выводить свои собственные хост-classы из ServiceHost, как правило, для переопределения OnOpening для использования ServiceDescription для принудительного добавления конечных точек по умолчанию или изменения поведения до открытия службы.

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

Существует пакет nuget, называемый WebActivator, который я нашел полезным для IIS-хостинга.

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

Вы добавляете некоторые атрибуты сборки в свой проект WCF.

 [assembly: WebActivatorEx.PreApplicationStartMethod ( typeof(MyActivator), "Start") ] public static class MyActivator { public static void Start() { // do stuff here } } 
Давайте будем гением компьютера.