Каков наилучший способ получить уведомление при первом запуске службы 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
}
}