J'ai une application Console qui héberge un service WCF. J'aimerais pouvoir déclencher un événement à partir d'une méthode du service WCF et gérer l'événement dans le processus d'hébergement du service WCF. Est-ce possible ? Comment faire ? Puis-je dériver une classe personnalisée de ServiceHost ?
Réponses
Trop de publicités?Il n'est pas nécessaire d'hériter de ServiceHost
. Il existe d'autres approches pour résoudre votre problème.
Vous pouvez transmettre une instance de la classe de service, au lieu d'un type à ServiceHost
. Ainsi, vous pouvez créer l'instance avant de lancer l'application ServiceHost
et ajoutez vos propres gestionnaires d'événements à tous les événements qu'il expose.
Voici un exemple de code :
MyService svc = new MyService();
svc.SomeEvent += new MyEventDelegate(this.OnSomeEvent);
ServiceHost host = new ServiceHost(svc);
host.Open();
L'utilisation de cette approche comporte certaines mises en garde, qui sont décrites dans le document suivant http://msdn.microsoft.com/en-us/library/ms585487.aspx
Vous pouvez aussi avoir une classe singleton bien connue, que vos instances de service connaissent et qui appelle explicitement ses méthodes lorsque des événements se produisent.
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;
}
}
Vous pouvez définir votre service WCF avec 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;
...
...
}