Событие запуска приложения WCF - PullRequest
53 голосов
/ 11 апреля 2009

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

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

Ответы [ 8 ]

80 голосов
/ 11 апреля 2009

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

public Service : IContract
{
    public Service(){ // regular constructor }
    static Service(){ // Only called first time it's used. }
}
22 голосов
/ 01 сентября 2011

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

8 голосов
/ 09 июля 2014

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

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

public class WcfApplication : HttpApplication
{
    protected void Application_Start()
    {
    }
}
5 голосов
/ 11 апреля 2009

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

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

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

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

Марк

4 голосов
/ 19 июля 2011

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

//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)

Удачи!

1 голос
/ 25 апреля 2012
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
0 голосов
/ 03 марта 2015

Существует пакет 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
    }
}
0 голосов
/ 18 марта 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...