¿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?
¿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?
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
(-1) Realmente no lo hago Entiendo cómo esta "respuesta" ayuda a alguien. Básicamente le preguntaste y no respondió su pregunta. –
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! –
Paul Alexander proporcionó una mejor respuesta que realmente me ayudó mucho. –
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. }
}
Esperaba algo más específico del host, es decir, algo en la aplicación que aloja el servicio. – user89166
respuesta paul funcionó para mí. ¡El constructor estático es el salvador! – CodeNinja
Perfecto. Y hoy aprendí sobre constructores 'estáticos' por primera vez. – eouw0o83hf
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!
He usado este enlace, hay varias soluciones: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx
Gracias por este enlace. Fui con el enfoque 'AppInitialize()'. –
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. –
gracias, la respuesta más útil en este hilo –
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
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
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()
{
}
}
¿Puedes ampliar tu respuesta más? ¿Qué estás heredando exactamente? ¿Cómo funciona esto? Creo que su respuesta podría ayudarme, personalmente – Thomas
Es casi como si hubiera creado un nuevo proyecto de API web a partir de la plantilla predeterminada. –
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
}
}
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 –