`
varsoft
  • 浏览: 2422863 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

.NET Remoting中的事件处理(.NET Framework 2.0)(一)

阅读更多

在讲课的过程中,好多程序员都对Remoting中的事件处理很疑惑,现将完整实现Remoting中事件处理的过程写出来,并对大家容易犯错误的地方进行总结,希望能给大家一些帮助。
现假设有一个留言板程序:
以下代码中,MsgBoard为以Singleton模式存活于服务器端的共享留言板实例,AddMessage是客户端添加留言的接口,MsgBoard定义如下:

publicclassMsgBoard:MarshalByRefObject
{
publicdelegatevoidEventDelegate(stringinfo);
publiceventEventDelegateOnInfoAdded;
publicvoidAddMessage(stringinfo)
{
Console.WriteLine(info);
OnInfoAdded(info);
}

}


在有客户端添加留言时,激发一个事件,我们的客户端去订阅该事件来得到留言板更新的通知。
服务器端代码如下:

Usingdirectives#regionUsingdirectives

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.Remoting;
usingSystem.Runtime.Remoting.Channels;
usingSystem.Runtime.Remoting.Channels.Http;
usingSystem.Runtime.Serialization.Formatters;/**//////
#endregion


namespaceConsoleServer
{
classProgram
{
staticvoidMain(string[]args)
{
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(MyLibrary.MsgBoard),"MyUri",WellKnownObjectMode.

Singleton);
HttpChannelmyChannel
=newHttpChannel(1080);
ChannelServices.RegisterChannel(myChannel);

/**///////
IServerChannelSinksc=myChannel.ChannelSinkChain;
while(sc!=null)
{
if(scisBinaryServerFormatterSink)
{
((BinaryServerFormatterSink)sc).TypeFilterLevel
=TypeFilterLevel.Full;
//break;
}

if(scisSoapServerFormatterSink)
{
((SoapServerFormatterSink)sc).TypeFilterLevel
=TypeFilterLevel.Full;
//break;
}

sc
=sc.NextChannelSink;
}

Console.WriteLine("ServerStarted");
Console.ReadLine();
}

}

}


我们可以不要详细去关心服务器端程序的代码,我们只需要知道:
1,服务器注册了远程服务的类型
2,TypeFilterLevel = TypeFilterLevel.Full
由于从.NET Framework 1.1起,缺省情况下DelegateSerializationHolder不允许被反序列化,(即FormatterSink.TypeFilterLevel = TypeFilterLevel.low)。为了实现远程事件处理,我们必须解除该约束,使ServerFormatterSink.TypeFilterLevel = TypeFilterLevel.Full

我们更加需要关心的是我们的客户端代码:

Usingdirectives#regionUsingdirectives

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.Remoting;
usingSystem.Runtime.Remoting.Channels;
usingSystem.Runtime.Remoting.Channels.Http;
usingSystem.Runtime.Serialization.Formatters;
#endregion



namespaceConsoleClient
{
classProgram
{
staticvoidMain(string[]args)
{
try
{
RemotingConfiguration.RegisterWellKnownClientType(
typeof(MyLibrary.MsgBoard),"Http://localhost:1080/MyUri

");
HttpChannelmyChannel=newHttpChannel(1000);
ChannelServices.RegisterChannel(myChannel);
IServerChannelSinksc
=myChannel.ChannelSinkChain;
Console.WriteLine(
"ClientStarted");
MyLibrary.MsgBoardmsgbd
=newMyLibrary.MsgBoard();
/**////msgbd.OnInfoAdded+=newMyLibrary.MsgBoard.EventDelegate(msgbd_OnInfoAdded);
MyLibrary.eventClassevclass=newMyLibrary.eventClass();
msgbd.OnInfoAdded
+=newMyLibrary.MsgBoard.EventDelegate(evclass.msgbd_OnInfoAdded);/**////instead
msgbd.AddMessage("Helloall");
Console.ReadLine();
}

catch(Exceptionexc)
{
Console.WriteLine(exc.StackTrace);
Console.ReadLine();
}

}


publicstaticvoidmsgbd_OnInfoAdded(stringinfo)
{
Console.WriteLine(
"infoonserverevent:{0}",info);
}

}


}



请注意:此处我们使用一个实例方法去订阅服务器组件的事件,该实例类型定义如下:

publicclasseventClass:MarshalByRefObject
{
publicvoidmsgbd_OnInfoAdded(stringinfo)
{
Console.WriteLine(
"infofromserverevent:{0}",info);
}

}


为什么要这么做?
.NET Framework要求,事件的发布者必须拥有事件订阅者的元数据,而提供元数据的简单方法,就是让服务器程序添加对客户端程序的引用,但事实上我们不需要这么做,我们将订阅者声明在远程类的程序集中,而该程序集的元数据原本就是服务器和客户端共有的。此时我们要注意到,订阅事件的类,也被申明成MarshalByRefObject,这是.NET Framework 2.0出现的一个限制,委派在序列化信息中包含了函数对应实例的地址,在服务器端回掉时,可以寻址到客户端订阅的对象实例并执行相应的成员方法,既然能被服务器寻址,则该订阅对象要求是MarshalByRefObject,这不难理解。在.NET Framework 2.0之前,我们可以使用一个包含静态函数的委派去订阅服务器组件的事件,但2.0以后,如果用一个静态成员去订阅,该响应会在服务器空间内被执行,所以我们要记住,远程处理总是处理某种形式的实例成员,而静态成员不能。
总结一下:
要实现Remoting事件远程处理,要记住以下几个原则:
1,缺省情况下DelegateSerializationHolder不允许被反序列化
2,事件发起者必须拥有订阅者的元数据
3,远程处理总是处理实例成员,且该实例必须是MarshalByReference

例子
分享到:
评论

相关推荐

    深度挖掘.NET Framework 2.0(8):实战.NET Remoting(下)

    深度挖掘.NET Framework 2.0(8):实战.NET Remoting(下)

    深度挖掘.NET Framework 2.0(7):实战.NET Remoting(上)

    深度挖掘.NET Framework 2.0(7):实战.NET Remoting(上)

    深度挖掘.NET Framework 2.0(8)实战.NET Remoting(下).zip

    很好的一个讲解remoting的技术哈哈哈哈哈

    A Desktop Sticky Notes Application in the .NET Framework 2.0

    StickOut is a desktop sticky note with multi-user ... As a .NET Framework 2.0 Windows Forms application, it uses .NET Remoting to communicate with other StickOut users and exchange sticky notes with them

    CoreRemoting:具有经典.NET Remoting风格的RPC库

    核心远程处理具有经典.NET Remoting风格的RPC库(.NET Standard 2.0) NuGet软件包: : 这是为了什么? 帮助将使用.NET Remoting的应用程序迁移到.NET Core / .NET 5。 提供易于使用的RPC功能在分布式应用程序中...

    微软.NET Framework开源代码SSCLI

    基本上是 .NET Framework 2.0 的 Microsoft 实现,当然是实际发布的 .NET Framework 2.0 的一个简化版本。 sscli 2.0 中包含很多有趣的东西,包括: 01、vm - 包含了 CLI 核心实现,包括垃圾收集器、类装入器、...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    WCF完整示例源代码

    在 .NET Framework 2.0 以及前版本中,微软发展了 Web Service (SOAP with HTTP communication),.NET Remoting (TCP/HTTP/Pipeline communication) 以及基础的 Winsock 等通信支持,由于各个通信方法的设计方法不同...

    Windows通讯基础库WCF.zip

    在 .NET Framework2.0 以及前版本中,微软发展了 Web Service(SOAP with HTTP communication),.NET Remoting (TCP/HTTP/Pipeline communication) 以及基础的 Winsock 等通信支持。由于各个通信方法的设计方法不同,...

    中美 IT 培训 C# Asp.net 全套笔记1

    Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 Algorithm、OOA/OOD、UML 、VSS、Rational Rose、Visio等; 掌握Visual ...

    中美 IT 培训 C# Asp.net 笔记3

    Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 Algorithm、OOA/OOD、UML 、VSS、Rational Rose、Visio等; 掌握Visual ...

    中美 IT 培训 C# Asp.net 笔记2

    Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 Algorithm、OOA/OOD、UML 、VSS、Rational Rose、Visio等; 掌握Visual ...

    ASP.NETWeb服务、企业服务和.NETRemoting的性能

    本页内容简介目标结果.NETFramework2.0性能小结附录A:合成基线—空方法测试附录B—详细测试结果附录C:测试应用程序注意事项附录D:软件和硬件安装简介虽然一些技术领域(设备、硬件控制器、人身医疗保健服务、某些...

    北京中科信软 Visual Basic.NET培训

    一 NET开发基础 .NET Framework概述 VS2008开发环境 C#语言及编码规范 面向对象开发初步 接口和类的设计 SQL语句,存储过程 二 .NET框架&C#编程 面向对象的基本知识体系 .NET中的面向对象设计与应用 C#与...

    StickOut.msi StickOut.msi

    As a .NET Framework 2.0 Windows Forms application, it uses .NET Remoting to communicate with other StickOut users and exchange sticky notes with them There is a key file in the source code project ...

    Pro C# 2010 and the .NET 4 Platform(PDF清晰版)

    Whether you are moving to .NET for the first time or are already writing applications on .NET 2.0 or .NET 3.5, this book will provide you with a comprehensive grounding in the new technology and ...

    Bucode Enterprise Solution(BES) Beta1.0

    BES是面向.NET开发人员的一系列工具集,目前BES包括以下几部份: ...该工具是由布扣工作室提供的共享软件,运行环境.NET Framework2.0。 安装包内有:框架、代码生成器、服务管理器、及演示源代码

    值类型与引用类型理论内容.part01.rar

    精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure...

    值类型与引用类型理论内容.part05.rar

    精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure...

Global site tag (gtag.js) - Google Analytics