首页 > 编程语言 >跨应用程序域边界传输对象副本 ----继承某类的对象可以跨越应用程序域边界被引用,甚至被远程引用--.NET Remoting

跨应用程序域边界传输对象副本 ----继承某类的对象可以跨越应用程序域边界被引用,甚至被远程引用--.NET Remoting

时间:2022-12-01 08:57:21浏览次数:52  
标签:Remoting 边界 对象 System 应用程序 引用 using 远程

           当一个对象需要长途跋涉到另一个环境中时,需要将其marshal成一个可以传输的形态(比如在.NET Remoting中对象将被打包成一个serializable的ObjRef实例——这个ByRef就是指ObjRef这种形态);同理,当打包以后传输到目标地点,还要执行unmarshal的操作将其还原为内存中的对象

你实际上只拥有对这个对象的一个远程引用,虽然你可以调用它的方法,但实际上这些操作都是发生在远程的(就是前面讲过的过程)

 

NET Remoting分布式开发是在2003年,那时候是Framework1.0初次亮相之时,Remoting分布式开发是Framework1.0其中一个亮点。经过多年的发展,在2005年,WCF随着Framework2.0首先亮相。WCF是结合Remoting,Web服务,TCP/IP套接字,MSMQ信息,P2P,WSE等多方通讯的混合体。随着WCF的出现是否意昧着Remoting即将没落,答案是否定的。因为Remoting有其独到之处,在通讯效率,信息交换,安全性等多方面都有其特点,所以在企业内部系统的信息化交换层的开发当中,很多时候会使用Remoting进行开发

    

一、基础概念

Remoting是采用分布式进行编程的一种技术,主要用于管理跨应用程序域的同步和异步RPC 会话。在默认情况下,Remoting可从使用 HTTP 或 TCP 协议进行信息通讯,并使用 XML 编码的 SOAP 或二进制消息格式进行数据交换。.NET Remoting 提供了非常灵活和可扩展的编程框架,并且可以管理对象的状态。Remoting跟Web服务不同,它并不依赖于IIS,用户可以自己开发(Development)并部署(Dispose)宿主服务器,只需要服务器支持Framework。

二、Remoting的特点

Remoting可以灵活的定义其所基于的协议,比如http,tcp等。在使用TCP/IP的时候,Remoting能发挥更高的效率,其性能接近于DCOM。

Remoting一般需要通过一个应用程序或是Windows服务来承载,也可以使用iis部署。

Remoting必须要在一个支持Framework的开发环境下进行开发,无论客户端跟服务器端都必须支持Framework。

Remoting 支持许多状态管理选项,并且可能与来自同一个用户的多个调用相关或不相关,这取决于您选择的对象生命周期架构。

三、废话不多说直接上示例代码

1. 建立一个Model类库,注意因为对象要进行序列化转化,必须对其加上Serializable特性!

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Model
{ [Serializable] public class Person { public int ID { get; set;} public String Name {get;set;} publicint Age {get;set;} } }

2.建立一个可远程调用的对象,注意远程对象必须继承MarshalByRefObject,继承它才可以实现微软封装的远程调用类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using Model;
namespace Manager
{ 
   //类必须继承了MarshalByRefObject,才能进行远程调用
    代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using Model;
namespace Manager
{    //类必须继承了MarshalByRefObject,才能进行远程调用
public class PersonManager:MarshalByRefObject   
 {     
   public List<Person> GetList()      
   {           
     List<Person> personList =new List<Person>();           
FileStream stream =new FileStream("DataSource.sour", FileMode.Open, FileAccess.Read); //在服务器文件里面获取虚拟数据 BinaryFormatter formatter =new BinaryFormatter(); personList=(List<Person>)formatter.Deserialize(stream); //对虚拟数据进行反序列化获取集合 return personList;
} }
}
}

 

核心重点:

在一个应用程序中加载服务器端,服务器端的配置有两种试,一是直接写在代码里面。首先建立服务传送方式,可以选择用TcpServerChannel,也可使用HttpChannel,前者有着更高的效率。然后在ChannelService注册此传输通道,最后通过RemotingConfiguration的RegisterWellKnownServiceType方法注册远程对象。

注意WellKonwnObjectMode可选择为SingleTon或者SingleCall,前者使用单体模式,每个客户端进行访问都会使用同一个远程对象。后者会为每个请求建立一个远程对象。在这个例子里面我们使用SingleTon单体模式。

using System;

未完待续。。。。。

 

标签:Remoting,边界,对象,System,应用程序,引用,using,远程
From: https://www.cnblogs.com/dxqNet/p/16940361.html

相关文章

  • xcodebuild和xcrun实现自动打包iOS应用程序
    随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包......
  • Tomcat错误页重定向(应用程序错误消息)
    当Tomcat出现404、400等界面之后跳转到默认页1、创建新的错误页编写新的界面error.html,将此界面放到tomcat6/webapps/ROOT目录下2、创建编写web.xml修改Tomcat/weba......
  • 使用 ETW 对 .NET 应用程序进行性能诊断
    ​​下载代码示例​​您编写一个托管应用程序来亲身体验一下–您会觉得其速度较慢。您的应用程序在功能上是正常的,但其性能有很多不足。您想诊断出性能问题并解决这些问题......
  • 应用程序无法正常启动(0xc000007b)最佳解决方案
    1.问题描述我卸载程序的时候,把vc++运行库给卸载掉了,打开vm虚拟机的时候,就出现了应用程序无法正常启动(0xc000007b)的错误2.运行库版本我们的绝大数软件,比如vm、qq、vc+......
  • const引用和指针
    1、可以为const引用初始化一个非const的对象、字面值,甚至是一般表达式。2、对引用初始化时必须严格进行类型匹配,但是const引用初始化时不需要类型匹配,只要可以转换为const......
  • 为什么移动APP应用程序需要SSL证书?
    在谈论SSL/TLS证书时,人们通常是考虑到WordPress或是其他桌面网站的安全问题。然而,移动应用程序安全性也需要得到同等重视。为什么需要重视移动应用程序安全?根据互联网监......
  • ArcGIS QGIS学习二:图层如何只显示需要的部分几何面数据(附最新坐标边界下载全国省市区
    目录前言准备SHP数据ArcMap的筛选QGIS的筛选如何编写查询条件前言当我们用GIS软件打开一个SHP文件的时候,会显示出里面全部的几何图形,假如我只想要其中的一部分数据显示......
  • 打开.xlsx或.pptx文件,提示以下错误: 不是有效的win32应用程序
    转载地址:https://zhidao.baidu.com/question/335314126.html出现这个问题,多半是因为文件打开方式关联错了。例如,通常默认的打开.xls或.xlsx文件的程序应该是MicrosoftEx......
  • 解决golang循环引用问题
    go出现包循环引用的问题,首当其冲的就是程序结构没设计好,最好的方式就是在项目框架构建的时候,将各个模块设计好,避免出现该问题。尝试分层的设计,高层依赖于低层,低层不依赖......
  • C++引用和指针
    1、有时候要想搞清楚一条赋值语句到底是改变了指针的值还是改变了指针所指对象的值不太容易,最好的办法就是记住赋值永远改变的等号左边的对象,例如:*p=0,改变的是p所指对象的......