`
leonardleonard
  • 浏览: 820889 次
社区版块
存档分类
最新评论

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

阅读更多

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

    public class MsgBoard:MarshalByRefObject 
    
{
        
public delegate void EventDelegate(string info);
        
public event EventDelegate OnInfoAdded;
        
public void AddMessage(string info)
        
{
            Console.WriteLine(info);
            OnInfoAdded(info);
        }

    }


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

Using directives#region Using directives

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


namespace ConsoleServer
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            RemotingConfiguration.RegisterWellKnownServiceType(
typeof(MyLibrary.MsgBoard), "MyUri", WellKnownObjectMode.

Singleton);
            HttpChannel myChannel 
= new HttpChannel(1080);
            ChannelServices.RegisterChannel(myChannel);

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

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

                sc 
= sc.NextChannelSink;
            }

            Console.WriteLine("Server Started");
            Console.ReadLine();
        }

    }

}


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

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

Using directives#region Using directives

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



namespace ConsoleClient
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
try
            
{
                RemotingConfiguration.RegisterWellKnownClientType(
typeof(MyLibrary.MsgBoard), "Http://localhost:1080/MyUri

");
                HttpChannel myChannel = new HttpChannel(1000);
                ChannelServices.RegisterChannel(myChannel);
                IServerChannelSink sc 
= myChannel.ChannelSinkChain;
                Console.WriteLine(
"Client Started");
                MyLibrary.MsgBoard msgbd 
= new MyLibrary.MsgBoard();
                
/**////msgbd.OnInfoAdded += new MyLibrary.MsgBoard.EventDelegate(msgbd_OnInfoAdded);
                MyLibrary.eventClass evclass = new MyLibrary.eventClass();
                msgbd.OnInfoAdded 
+= new MyLibrary.MsgBoard.EventDelegate(evclass.msgbd_OnInfoAdded);/**////instead
                msgbd.AddMessage("Hello all");
                Console.ReadLine();
            }

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

        }


        
public static void msgbd_OnInfoAdded(string info)
        
{
            Console.WriteLine(
"info on server event:{0}", info);
        }

    }


}



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

    public class eventClass:MarshalByRefObject 
    
{
        
public void msgbd_OnInfoAdded(string info)
        
{
            Console.WriteLine(
"info from server event:{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中的.NET Remoting是一种强大的技术,它允许不同进程间的对象通信,甚至跨越不同的计算机。在本文中,我们将深入探讨.NET Remoting的实践应用,特别是下篇部分,我们将关注更高级的主题和技巧。 ...

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

    在"深度挖掘.NET Framework 2.0(8)实战.NET Remoting(下)"这个主题中,我们将深入探讨.NET Remoting的各个方面。 .NET Remoting的核心概念是远程激活和远程调用。远程激活允许在远程进程中创建对象,而远程调用则...

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

    .NET Framework 2.0是微软开发的一个全面的开发平台,它包含了用于构建、部署和运行应用程序和服务所需的所有组件。在这一系列的深度挖掘教程中,我们将聚焦于.NET Remoting技术,这是一种强大的通信机制,允许不同...

    .net framework 2.0程序设计答案

    .NET Framework 2.0 是微软开发的一个重要框架,它为开发者提供了一个托管的代码执行环境,使得编写和运行跨平台的应用程序变得更加简单。这个框架包含了众多的组件和服务,旨在提高开发效率、安全性以及应用程序的...

    .NET Remoting技术构建分布式

    .NET Remoting是Microsoft为.NET Framework设计的一种分布式通信技术,允许不同的应用程序域(AppDomain)之间进行交互,即使这些域位于不同的进程或计算机上。它提供了在.NET应用程序之间透明地调用方法的能力,...

    Microsoft .NET Framework 2.0 - Distributed Application Development (70-529) Mega Guide

    在分布式应用程序开发中,.NET Framework 2.0引入了Web服务和.NET Remoting作为通信的关键技术。Web服务基于SOAP协议,允许跨平台、跨语言的互操作性,通过HTTP进行通信。而.NET Remoting则专为.NET应用程序间的通信...

    微软.NET Framework开源代码SSCLI

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

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

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

    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

    VB_NET Remoting 高级技术手册

    《VB_NET Remoting 高级技术手册》是针对.NET Framework中的Remoting技术的一份详尽指南,主要关注在VB.NET环境下实现C/S(客户端/服务器)和B/S(浏览器/服务器)系统的分布式通信。Remoting是.NET框架提供的一种...

    C#和.NET 2.0实战:平台、语言与框架

    《C#和.NET 2.0实战:平台、语言与框架》是一本深入探讨.NET 2.0技术体系的重要书籍,对于想要深入了解.NET平台、C#编程语言以及相关框架的开发者来说,它提供了丰富的知识资源。这本书以实战为导向,旨在帮助读者...

    C# remoting 聊天室

    C# Remoting是一种在.NET Framework 2.0中实现分布式应用程序的技术,它允许对象在不同的应用程序域(AppDomains)之间进行交互,甚至可以跨越网络。这个"聊天室"项目是利用C# Remoting来创建一个客户端-服务器架构...

    .net framework 3.5开发指南

    .NET Framework 3.5是微软推出的一个关键性更新,它在.NET Framework 2.0的基础上进行了大量的改进和扩展,为开发者提供了更为丰富的功能和更高效的开发环境。 首先,我们要理解.NET Framework的核心组成部分:公共...

    ASP.NET 2.0 高级编程(第4版)

    《ASP.NET 2.0 高级编程(第4版)》是一本深入探讨ASP.NET技术的专业书籍,由清华大学出版社出版。这本书旨在帮助读者掌握ASP.NET 2.0的高级特性,提升Web应用开发能力。以下将根据书中的章节标题(假设PDF文件对应...

    Remoting双向通信V2.0.rar

    Remoting,全称为“.NET Framework Remoting”,是微软.NET框架中的一个高级特性,它提供了在分布式环境中进行跨进程通信的能力。这个技术允许对象在不同的应用程序域(AppDomain)之间进行交互,甚至跨越网络进行...

    WCF完整示例源代码

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

Global site tag (gtag.js) - Google Analytics