Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Ну, это может быть немного сложно, поскольку предпочтительный способ вызова служб WCF находится на основе "за звонок", например. у вас на самом деле нет ничего, что "началось", а затем просто зависало, действительно.

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

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

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

Марк

Ответ 2

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

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

Ответ 4

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

<%@ Application Codebehind="Global.asax.cs" Inherits="WcfApplication" Language="C#" %>

public class WcfApplication : HttpApplication
{
    protected void Application_Start()
    {
    }
}

Ответ 5

Если у вас есть 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)

Удачи!

Ответ 6

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

Ответ 7

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

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

Ответ 8

Существует пакет 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
    }
}