2008-09-26 18 views
14

Tengo una aplicación de consola que aloja un servicio WCF. Me gustaría poder desencadenar un evento desde un método en el servicio WCF y manejar el evento en el proceso de alojamiento del servicio WCF. es posible? ¿Cómo haría esto? ¿Puedo derivar una clase personalizada de ServiceHost?Envío de mensajes al proceso de host WCF

Respuesta

14

No necesita heredar de ServiceHost. Hay otros enfoques para su problema.

Puede pasar una instancia de la clase de servicio, en lugar de un tipo a ServiceHost. Por lo tanto, puede crear la instancia antes de iniciar el ServiceHost y agregar sus propios manejadores de eventos a cualquier evento que exponga.

He aquí algunos ejemplos de código:

MyService svc = new MyService(); 
svc.SomeEvent += new MyEventDelegate(this.OnSomeEvent); 
ServiceHost host = new ServiceHost(svc); 
host.Open(); 

Hay algunas advertencias cuando se utiliza este enfoque, como se describe en http://msdn.microsoft.com/en-us/library/ms585487.aspx

O usted podría tener una clase Singleton bien conocido, que sus instancias de servicio conocen y llama explícitamente a sus métodos cuando suceden los eventos.

+0

¡Guau! Ambos enfoques tienen perfecto sentido para mí; Me siento tonto. Tampoco pensé en ninguno de esos. Supongo que acabo de cegarme por la complejidad de WCF, ya que es nuevo para mí. – dotnetengineer

0
using ... 
using ... 

namespace MyWCFNamespace 
{ 
    class Program { 

     static void Main(string[] args){ 
      //instantiate the event receiver 
      Consumer c = new Consumer(); 

      // instantiate the event source 
      WCFService svc = new WCFService(); 
      svc.WCFEvent += new SomeEventHandler(c.ProcessTheRaisedEvent); 

      using(ServiceHost host = new ServiceHost(svc)) 
      { 
       host.Open(); 
       Console.Readline(); 
      } 
     } 
    } 


    public class Consumer() 
    { 
     public void ProcessTheRaisedEvent(object sender, MyEventArgs e) 
     { 
      Console.WriteLine(e.From.toString() + "\t" + e.To.ToString()); 
     } 
    } 
} 


namespace MyWCFNamespace 
{ 
    public delegate void SomeEventHandler(object sender,MyEventArgs e) 

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
    public class WCFService : IWCFService 
    { 
     public event SomeEventHandler WCFEvent; 

     public void someMethod(Message message) 
     { 
      MyEventArgs e = new MyEventArgs(message); 
      OnWCFEvent(e); 
     } 

     public void OnWCFEvent(MyEventArgs e) 
     { 
      SomeEventHandler handler = WCFEvent; 
      if(handler!=null) 
      { 
       handler(this,e); 
      } 
     } 

    // to do 
    // Implement WCFInterface methods here 
    } 


    public class MyEventArgs:EventArgs 
    { 
     private Message _message; 
     public MyEventArgs(Message message) 
     { 
      this._message=message; 
     } 
    } 
    public class Message 
    { 
     string _from; 
     string _to; 
     public string From {get{return _from;} set {_from=value;}} 
     public string To {get{return _to;} set {_to=value;}} 
     public Message(){} 
     public Message(string from,string to) 
     this._from=from; 
     this._to=to; 
    } 
} 

Puede definir su servicio WCF con InstanceContextMode = InstanceContextMode.Single.

TestService svc = new TestService(); 
svc.SomeEvent += new MyEventHandler(receivingObject.OnSomeEvent); 
ServiceHost host = new ServiceHost(svc); 
host.Open(); 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] // so that a single service instance is created 
    public class TestService : ITestService 
    { 
     public event MyEventHandler SomeEvent; 
     ... 
     ... 
    } 
Cuestiones relacionadas