C#远程数据访问(Remoting)

摘要:
即在服务器端实现远程对象,而在客户端则删除这些实现的元数据。更好的解决办法是配合反射来处理。注册远程对象时,我们不要注册类,通过定义接口,而实现过程的类又继承这一个接口,通过类名去反射创建这一个类对象,然后通过强制类型转换,把这个object赋给接口,这样就可以完全的分离了!

1、创建一个远程对象(DLL):新建一个解决方案(类库),命名为RemoteObject

创建一个类 RemoteTest,代码如下

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data;

usingSystem.Data.SqlClient;

namespaceRemoteObject

{

publicclassRemoteTest : System.MarshalByRefObject//这是不能少的

{

SqlConnectioncon;

DataSetds;

SqlDataAdapterda;

stringconStr = "data source=HEYU\\SQLEXPRESS;initial catalog=schooldatabase;integrated security=SSPI;persist security info=False;packet size=4096";

stringqueryStr = "select * from book";

publicDataTabledatable()

{

using (con = newSqlConnection(conStr))

{

using (da = newSqlDataAdapter(queryStr, con))

{

ds = newDataSet();

da.Fill(ds, "Categories");

returnds.Tables["Categories"];

}

}

}

}

}

2、创建服务器端程序,新建一个解决方案,命名为Sever,添加引用上面编译好的DLL

代码如下:

usingSystem;

usingSystem.Windows.Forms;

usingSystem.Runtime.Remoting;//这个要添加引用

usingSystem.Runtime.Remoting.Channels;

usingSystem.Runtime.Remoting.Channels.Tcp;

//也可以改用HTTP传输实现

namespaceSever

{

publicpartialclassForm1 : Form

{

publicForm1()

{

InitializeComponent();

}

privatevoidForm1_Load(objectsender, EventArgse)

{

//注意第二个参数要和客户端的一致,可以为TRUE也可以为FALSE

ChannelServices.RegisterChannel(newTcpServerChannel(9999), true);

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(RemoteObject.RemoteTest), "heyu", WellKnownObjectMode.Singleton);

}

}

}

3创建服务器端程序,新建一个解决方案,命名为Client,添加引用上面编译好的DLL

代码如下:

usingSystem;

usingSystem.Windows.Forms;

usingSystem.Runtime;

usingSystem.Runtime.Remoting; //这个要添加引用

usingSystem.Runtime.Remoting.Channels;

usingSystem.Runtime.Remoting.Channels.Tcp;

namespaceClient

{

publicpartialclassForm1 : Form

{

publicForm1()

{

InitializeComponent();

}

privatevoidForm1_Load(objectsender, EventArgse)

{

ChannelServices.RegisterChannel(newTcpClientChannel(),true);

RemoteObject.RemoteTestobj = (RemoteObject.RemoteTest)Activator.GetObject(typeof(RemoteObject.RemoteTest), "tcp://192.168.1.103:9999/heyu");

this.dataGridView1.DataSource = obj.datable();

}

}

}

以上的程序可以说是不能够再简单的了,只适合于初学者!因为创建这样的程序存在很多的缺点:

1、没有使用配置文件,使得更改服务器时要重新编译程序。

2、创建出来的远程对象服务器端和客户端的是一样,为了代码的安全性,且降低客户端对远程对象元数据的相关性,我们有必要对这种方式进行改动。即在服务器端实现远程对象,而在客户端则删除这些实现的元数据。更好的解决办法是配合反射来处理。注册远程对象时,我们不要注册类,通过定义接口,而实现过程的类又继承这一个接口,通过类名去反射创建这一个类对象(注意是object不是class,然后通过强制类型转换,把这个object赋给接口,这样就可以完全的分离了!做成代理工厂。

免责声明:文章转载自《C#远程数据访问(Remoting)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Chrome浏览器下调试SASSjquery网络引用地址(收藏)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows下搭建MeeGo开发环境

一、我搭建的实际环境 硬件环境: 32-bit Intel Core 2 CPU ,CPU支持VT虚拟化技术的。软件环境: 32位Windows 7 旗舰版。文件系统: NTFS文件系统。 二、安装MeeGo SDK 1、下载并安装MeeGo SDK安装包,MeeGo SDK在线安装包下载: http://download3.meego.com/MeeGo...

LINUX进程组调度机制分析【转】

转自:https://oenhan.com/task-group-sched 又碰到一个神奇的进程调度问题,在系统重启过程中,发现系统挂住了,过了30s后才重新复位,真正系统复位的原因是硬件看门狗重启的系统,而非原来正常的reboot流程。硬件狗记录的复位时间,将不喂狗的时间向前推30s分析串口记录日志,当时的日志就打印了一句话:“sched: RT th...

Babel之babel-polyfill、babel-runtime、transform-runtime详解

引言 babel默认只转换新的 JavaScript 语法,比如箭头函数、扩展运算(spread)。 不转换新的 API,例如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign)都不会转译。如果想使用这些新的对象和方法...

GO语言调试利器dlv快速上手

 https://www.cnblogs.com/realjimmy/p/13418508.html     一、dlv的安装 1)下载dlv git clone https://github.com/go-delve/delve.git $GOPATH/src/github.com/go-delve/delve 或者 go get github.com...

Java中的异常处理机制的简单原理和应用?

程序运行过程中可能出现各种“非预期”情况,这些非预期情况可能导致程序非正常结束。 为了提高程序的健壮性,Java提供了异常处理机制: try { s1... s2... s3... } catch(Exception ex) { //对异常情况的修复处理 } 对于上面处理流程,当程序执行try块里的s1、s2、s3遇到异常时,Java虚拟机将会把这个异常...

记录ASP.NET CORE 3 部署过程

    环境为:window server 2008 IIS6.1  net core 3     首先时安装net.core 运行时。地址为:https://dotnet.microsoft.com/download/dotnet-core/3.0   大家找对应的版本进行下载安装。     IIS中创建网站,配置应用程序池.NET FrameWork...