2009-04-11 17 views
47

¿Cuál es la mejor manera de recibir una notificación cuando se inicia por primera vez un servicio WCF?Evento de inicio de aplicación WCF

¿Hay algo similar al método Application_Start en Global.asax para una aplicación ASP.NET?

+1

Una respuesta de Job Vermeulen blow vincula una solución de trabajo y le da opciones. Se puede hacer.También se puede encontrar una pregunta relacionada que proporciona una solución de trabajo aquí: http://stackoverflow.com/questions/2453353/what-is-the-global-asax-application-start-equivalent-when-using-was-in- iis7 –

Respuesta

4

Bueno, eso podría ser un poco difícil ya que la forma preferida de llamar a los servicios de WCF está en un "por llamada" la base, por ejemplo, realmente no tienes nada que esté "iniciado" y luego simplemente se cuelga, realmente.

Si está alojando su servicio en IIS o WAS, incluso se trata de una "carga a pedido" de su servidor de servicio: cuando llega un mensaje, el servidor se crea una instancia y maneja la solicitud.

Si realiza una autohospeda, tiene una consola o una aplicación de Winforms, de modo que puede conectar allí para saber cuándo comienzan. Si tiene un servicio de Windows para alojar su servidor de servicio, lo más probable es anular los métodos OnStart y OnStop en la clase ServiceBase -> enganchar allí.

La pregunta es más: ¿qué es exactamente lo que estás tratando de lograr? ¿Solo registrando o algo así, o quieres tener algo acumulado en la memoria para quedarte?

Marc

+77

(-1) Realmente no lo hago Entiendo cómo esta "respuesta" ayuda a alguien. Básicamente le preguntaste y no respondió su pregunta. –

+8

Traté de explicar que no hay nada exactamente igual a Application_Start en WCF, pero traté de proporcionar ideas en las que pudiera conectar para detectar lo que necesita detectar ... lo siento de esa manera. Lo intenté lo mejor posible, pero no dude en proporciona una mejor respuesta! –

+3

Paul Alexander proporcionó una mejor respuesta que realmente me ayudó mucho. –

74

Como es solo una clase, puede usar un constructor estático que se llamará la primera vez que se use el tipo.

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

Esperaba algo más específico del host, es decir, algo en la aplicación que aloja el servicio. – user89166

+7

respuesta paul funcionó para mí. ¡El constructor estático es el salvador! – CodeNinja

+7

Perfecto. Y hoy aprendí sobre constructores 'estáticos' por primera vez. – eouw0o83hf

4

Si usted tiene un servicio WCF alojado en sí mismo, puede agregar un evento a la apertura del servicio, y dentro de este evento se puede asignar una variable estática, al igual que este mensaje:

//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(); 
    } 
} 

(Originalmente desde http://www.eggheadcafe.com/community/aspnet/18/10162637/help-in-maintain-global-variable-in-wcf.aspx)

buena suerte!

21

He usado este enlace, hay varias soluciones: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

+0

Gracias por este enlace. Fui con el enfoque 'AppInitialize()'. –

+1

Esta es la respuesta correcta en mi opinión (!!!), lea a continuación en el artículo y encontrará cómo registrarse en iis7 eventos de servicio svc wcf alojados. –

+0

gracias, la respuesta más útil en este hilo –

1
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

La API ServiceHost estándar para servicios de alojamiento de Windows Communication Foundation (WCF) es un punto de extensibilidad en la arquitectura de WCF. Los usuarios pueden derivar sus propias clases de host de ServiceHost, generalmente para anular OnOpening para usar ServiceDescription para agregar puntos finales predeterminados de manera imperativa o modificar comportamientos, antes de abrir el servicio.

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

7

Siempre se puede añadir manualmente archivos global.asax a su aplicación de servicio de WCF, ya que alojado en IIS y se integra con ASP.NET tubería:

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

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

¿Puedes ampliar tu respuesta más? ¿Qué estás heredando exactamente? ¿Cómo funciona esto? Creo que su respuesta podría ayudarme, personalmente – Thomas

+0

Es casi como si hubiera creado un nuevo proyecto de API web a partir de la plantilla predeterminada. –

0

hay un paquete llamado Nuget WebActivator que encontré útil para el alojamiento de IIS.

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

Se agrega un poco de montaje atribuye a su proyecto WCF.

[assembly: WebActivatorEx.PreApplicationStartMethod 
(
    typeof(MyActivator), 
    "Start") 
] 

public static class MyActivator 
{ 
    public static void Start() 
    { 
     // do stuff here 
    } 
} 
Cuestiones relacionadas