我有一个托管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. Erlang进程发送消息
- 2. 发送消息到其他进程
- 3. 从主机发送JMS消息
- 4. 在主机之间发送消息,不进行探测或向每个主机询问新消息
- 5. 如何发送消息到Android主题
- 6. 使用Codeigniter发送消息到手机
- 7. 发送ems消息从pc到手机
- 8. C++ - 进程之间发送消息
- 9. 发送消息从主机页到对话框
- 10. 从主机iOS设备发送消息到Android Wear手表
- 11. 无法连接到SMTP主机。消息无法发送
- 12. wcf发送JSON格式的soap消息
- 13. 用WCF 4.0发送XSD消息
- 14. SignalR - 从WCF项目发送消息
- 15. WCF - 检查发送/接收的消息?
- 16. 发送点击消息到另一个应用程序进程
- 17. 发送消息或收到消息?
- 18. 将消息发送到远程JMS主题
- 19. 从工作非gui线程发送消息到主窗口
- 20. ,消息收到消息,但确认是由其他进程发送的?
- 21. 将消息发送到不同线程
- 22. 发送日志消息到远程API
- 23. 发送消息到Windows GUI线程
- 24. MSMQ发送消息到远程队列
- 25. Java发送消息线程
- 26. Android程序发送消息
- 27. 发送消息到对象
- 28. 发送消息到Twitter
- 29. 发送消息到WM_PAINT
- 30. 如何发送消息到Erlang的进程组
不错!这两种方法对我来说都很合理。我觉得自己愚蠢,我没有想到这两者中的任何一个。我想我刚刚被WCF本身的复杂性所蒙蔽,因为它对我来说是新的。 – dotnetengineer 2008-09-26 14:39:55