remoting的远程操作

2023-10-13 12:08
文章标签 操作 远程 remoting

本文主要是介绍remoting的远程操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

           .net里面可远程操作对象有2种:值封送对象(其特点是通过序列化操作可保存会话状态),引用封送对象(不能使用序列化保存会话状态,只能通过创建副本进行远程操作)。在remoting里面由于单元素对象激活和客户激活是有会话状态的,所以牵涉到保存对话状态,这时的远程操作就必须使用值封送对象,值封送对象可以通过序列化操作来保存会话状态;可以申请新的对象实例,并且对新的新的对象实例的操作或者set(写入的值),传到服务器端使用(这就是保存会话状态);而单调用元素是没有会话状态的,所以不能够使用值封送对象来远程操作,只能使用引用封装对象,只能在客户端创建一个服务器端的副本操作,意思是同样可以创建新的对象实例,但对其操作的结果只能是在本地的副本上面,不能返回到服务器端,不能传到服务器端使用。只能在本地使用。
分别看看实例:
首先看客户端调用:
我们先来修改一下远程对象:
dll对象的修改:
using System;

namespace RemoteObject
{
    public class MyObject:MarshalByRefObject
    {
        private MBV _mbv;
        private MBR _mbr;
        public int Add(int a,int b)
        {
            return a+b;
        }

        public MBV GetMBV()
        {
            return new MBV(100);
        }

        public MBR GetMBR()
        {
            return new MBR(200);
        }

        public void SetMBV(MBV mbv)
        {
            this._mbv=mbv;
        }

        public int UseMBV()
        {
            return this._mbv.Data;
        }

        public void SetMBR(MBR mbr)
        {
            this._mbr=mbr;
        }

        public int UseMBR()
        {
            return this._mbr.Data;
        }
    }

    [Serializable]
    public class MBV
    {
        private int _data;
        public MBV(int data)
        {
            this._data=data;
        }
        public int Data
        {
            get
            {
                return this._data;
            }
            set
            {
                this._data=value;
            }
        }
    }

    public class MBR:MarshalByRefObject
    {
        private int _data;
        public MBR(int data)
        {
            this._data=data;
        }
        public int Data
        {
            get
            {
                return this._data;
            }
            set
            {
                this._data=value;
            }
        }
    }
}
           客户端的修改:
RemoteObject.MyObject app=(RemoteObject.MyObject)Activator.CreateInstance(typeof(RemoteObject.MyObject),null,new object[]{new System.Runtime.Remoting.Activation.UrlAttribute(System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"])});
            RemoteObject.MBV mbv=app.GetMBV();
            Console.WriteLine(mbv.Data);
            RemoteObject.MBR mbr=app.GetMBR();
            Console.WriteLine(mbr.Data);
            mbv=new RemoteObject.MBV(600);
            app.SetMBV(mbv);
            Console.WriteLine(app.UseMBV());
            //mbr=new RemoteObject.MBR(200);
            //app.SetMBR(mbr);
            //Console.WriteLine(app.UseMBR());
            Console.ReadLine();
             结果可以看到输出100,200,600,就象前面说的一样,600是我们用了set方法,象新建的对象里面输入的值,而这个值同样也被传到了服务器端里面,这就是序列化的保存了会话状态。这个对于客户端激活和Singleton是同样有效的。
             看看如果是Singleton我们也来试试。
             客户端程序修改:
RemoteObject.MyObject app=(RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
             客户端配置文件同样也要修改.
             得到的结果和客户端激活完全一样。
            怎样去理解不保存对话状态而调用远程对象呢,我们用dataset来试一下:
远程对象修改如下:
using System;
using System.Data;

namespace RemoteObject
{
    public class MyObject:MarshalByRefObject
    {
        public DataSet Method(DataSet ds)
        {
            DataTable dt=ds.Tables[0];
            foreach(DataRow dr in dt.Rows)
            {
                dr["test"]=dr["test"]+"_ok";
            }
            return ds;
        }
    }
}
            客户端修改如下:
RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            DataSet ds=new DataSet();
            DataTable dt=new DataTable();
            dt.Columns.Add(new DataColumn("test",typeof(System.String)));
            DataRow dr=dt.NewRow();
            dr["test"]="data";
            dt.Rows.Add(dr);
            ds.Tables.Add(dt);
            ds=app.Method(ds);
            Console.WriteLine(ds.Tables[0].Rows[0]["test"].ToString());
            Console.ReadLine();
           运行后发现输出data_ok了。
           这里的data就在客户端,并没有传到服务器上面去,后面的_ok就是从服务器上面取下来的。这个结果是2个结果组合而成。
(感谢lovecherry的blog,我的文章里面加入了一些自己的理解和思考,如果大家想看到纯净版的remoting请看http://www.cnblogs.com/lovecherry。不敢掠人之美。)

这篇关于remoting的远程操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203100

相关文章

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.