Каков наилучший способ получить уведомление при первом запуске службы WCF?
Есть ли что-то похожее на метод Application_Start в приложении Global.asax для приложения ASP.NET?
Каков наилучший способ получить уведомление при первом запуске службы WCF?
Есть ли что-то похожее на метод Application_Start в приложении Global.asax для приложения ASP.NET?
Ну, это может быть немного сложно, поскольку предпочтительный способ вызова служб WCF находится на основе "за звонок", например. у вас на самом деле нет ничего, что "началось", а затем просто зависало, действительно.
Если вы размещаете свою услугу в IIS или WAS, это даже "по требованию загрузки" вашего хоста-службы - когда приходит сообщение, узел создается и обрабатывает запрос.
Если вы самостоятельно используете хост, у вас есть консоль или приложение Winforms, поэтому вы можете заглядывать туда, чтобы узнать, когда они начнутся. Если у вас есть служба Windows для размещения вашего хоста, вы, скорее всего, переопределите методы OnStart и OnStop в классе ServiceBase → .
Вопрос в том, что именно вы пытаетесь выполнить? Просто регистрируясь или что-то в этом роде, или вы хотите, чтобы что-то запомнилось в памяти, чтобы придерживаться?
Марк
Поскольку это просто класс, вы можете использовать статический конструктор, который будет вызываться при первом использовании Type.
public Service : IContract
{
    public Service(){ // regular constructor }
    static Service(){ // Only called first time it 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. Пользователи могут выводить свои собственные хост-классы из 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
    }
}