样例:SOAP 受控代码事件
下列代码演示如何在两个应用程序之间引发受控代码事件。客户端有一个本地对象,注册为接收远程对象的事件通知。客户端呼叫服务器对象时,就引发事件,产生对客户端本地对象的回叫。
服务器端
zap.cs using System;
namespace Zap { // 定义事件参数 public class GreetingEventArgs : EventArgs { public GreetingEventArgs(string greeting) { this.greeting = greeting; }
public string greeting; }
// 定义事件 public delegate void GreetingEvent(object sender, GreetingEventArgs e);
// 定义服务 public class Waz : MarshalByRefObject { // 客户端将预定和取消预定此事件 public event GreetingEvent Greeting;
// 由客户端远程调用的方法 public void HelloMethod(string greeting) { Console.WriteLine("Received String {0}", greeting);
// 将字符串打包到 GreetingEventArgs 中 GreetingEventArgs e = new GreetingEventArgs(greeting);
// 引发事件 if (Greeting != null) { Greeting(this, e); } } } }
host.cs
using System; using System.IO; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels.HTTP;
public class Host { public static void Main(string[] args) { // 手动加载 http 通道。 // 这也可以在 Remoting 配置文件中完成。 ChannelServices.RegisterChannel(new HTTPChannel(999));
// 注册服务器类型。 // 这也可以在 Remoting 配置文件中完成。 RemotingServices.RegisterWellKnownType( "Zap", // 程序集 "Zap.Waz", // 完整的类名 "host/Waz.soap", // URI WellKnownObjectMode.Singleton); // 对象模式
// 完成操作,等候用户退出 Console.WriteLine("主机已经准备好处理远程消息。"); Console.WriteLine("请按 ENTER 键退出"); String keyState = Console.ReadLine(); } }
客户端 client.cs
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels.HTTP;
using Zap;
// 将对象按引用本地封送到要引发的事件 public class Baz : MarshalByRefObject { public void GreetingHandler(object sender, GreetingEventArgs e) { Console.WriteLine("GreetingHandler 回叫: 问候: {0}\n", e.greeting); } }
public class Client { public static void Main(String[] args) { Baz baz = new Baz();
// 这也可以在 Remoting 配置文件中完成。
// 注册 HTTP 通道 ChannelServices.RegisterChannel(new HTTPChannel(0));
// 获取 SOAP URL 代理 Waz waz = (Waz)Activator.GetObject( typeof(Waz), "http://localhost:999/host/Waz.soap" );
// 预定事件: 通过 SOAP 进行 waz.Greeting += new GreetingEvent(baz.GreetingHandler);
for (int i = 0; i < 5; i++) { // 通过 SOAP 向 waz 发送 waz.HelloMethod("Bill" + " " + i); }
// 取消预定事件: 通过 SOAP 进行 waz.Greeting -= new GreetingEvent(baz.GreetingHandler); } }
| Makefile
makefile
all: Host.exe Zap.dll Client.exe
Host.exe: Host.cs csc /r:System.Runtime.Remoting.dll Host.cs
Zap.dll: Zap.cs csc /t:library -out:Zap.dll Zap.cs
Client.exe: Zap.dll Client.cs csc /r:System.Runtime.Remoting.dll /r:Zap.dll Client.cs | 在一个窗口中启动 host.exe 文件,然后在另一个窗口中启动 client.exe 文件。您将会看到事件被引发回到客户端。
这是诸多 .NET Remoting 应用程序中的一个小例子。.NET Remoting 提供了网络上的完全 CLR 受控代码类型系统,它还是优秀的 SOAP 服务器和客户端,因为它完全符合 SOAP 1.1 规范。
|
|