我有一個託管WCF服務的控制檯應用程序。我希望能夠從WCF服務中的方法中觸發事件,並在WCF服務的託管過程中處理事件。這可能嗎?我將如何做到這一點?我可以從ServiceHost派生自定義類嗎?發送消息到WCF主機進程
14
A
回答
14
您不需要繼承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
描述或者你可以有一個衆所周知的單例類,你的服務實例瞭解並在事件發生時明確調用它的方法。
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;
}
}
您可以InstanceContextMode = InstanceContextMode.Single
定義WCF服務。
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;
...
...
}
相關問題
- 1. 從主機發送JMS消息
- 2. 在主機之間發送消息,不進行探測或向每個主機詢問新消息
- 3. 如何發送消息到Android主題
- 4. 使用Codeigniter發送消息到手機
- 5. 發送ems消息從pc到手機
- 6. 發送消息從主機頁到對話框
- 7. 無法連接到SMTP主機。消息無法發送
- 8. C++ - 進程之間發送消息
- 9. 發送點擊消息到另一個應用程序進程
- 10. SignalR - 從WCF項目發送消息
- 11. 用WCF 4.0發送XSD消息
- 12. WCF - 檢查發送/接收的消息?
- 13. 將消息發送到遠程JMS主題
- 14. 從工作非gui線程發送消息到主窗口
- 15. ,消息收到消息,但確認是由其他進程發送的?
- 16. 發送消息到Windows GUI線程
- 17. 將消息發送到不同線程
- 18. MSMQ發送消息到遠程隊列
- 19. Android程序發送消息
- 20. 發送消息到Twitter
- 21. 發送消息到對象
- 22. 如何發送消息到Erlang的進程組
- 23. JAXL XMPP守護進程來發送和收到消息
- 24. 發送消息
- 25. 發送帶圖像的主動消息
- 26. 發送JMS消息導致通過JMS主題發送消息時警告
- 27. Mirth:如何發送ACK消息給發送者主機和端口
- 28. 本地消息傳遞主機無法發送1 MB數據
- 29. 消息發送電報機器人(PHP)
- 30. 發送Biztalk消息上下文到WCF服務
不錯!這兩種方法對我來說都很合理。我覺得自己愚蠢,我沒有想到這兩者中的任何一個。我想我剛剛被WCF本身的複雜性所矇蔽,因爲它對我來說是新的。 – dotnetengineer 2008-09-26 14:39:55