WCF サービスをホストするコンソール アプリケーションがあります。WCF サービスのメソッドからイベントを発生させ、WCF サービスのホスティング プロセスでイベントを処理できるようにしたいと考えています。これは可能ですか?どうすればいいですか?ServiceHost からカスタム クラスを派生させることはできますか?
dotnetengineer
質問する
8604 次
2 に答える
15
から継承する必要はありませんServiceHost
。あなたの問題には他のアプローチがあります。
タイプの代わりに、サービス クラスのインスタンスを に渡すことができますServiceHost
。したがって、 を開始する前にインスタンスを作成し、ServiceHost
公開するイベントに独自のイベント ハンドラを追加できます。
サンプルコードは次のとおりです。
MyService svc = new MyService();
svc.SomeEvent += new MyEventDelegate(this.OnSomeEvent);
ServiceHost host = new ServiceHost(svc);
host.Open();
http://msdn.microsoft.com/en-us/library/ms585487.aspxで説明されているように、このアプローチを使用する際にはいくつかの注意事項があります。
または、サービス インスタンスが認識し、イベントが発生したときにそのメソッドを明示的に呼び出す、よく知られたシングルトン クラスを使用することもできます。
于 2008-09-26T14:30:05.380 に答える
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;
}
}
で WCF サービスを定義できます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;
...
...
}
于 2010-11-28T06:14:30.720 に答える