使用.NET Remoting开发分布式应用——配置文件篇
我们已经知道可以通过编码的方式配置服务器通道和远程客户机,除此之外,还可以使用配置文件对服务器通道和远程客户机进行配置。使用远程客户机和服务器对象的配置文件的优点在于,用户无需修改任何一行代码,也无需进行重新编译,便可以配置通道和远程对象。
.NET提供了Remoting配置文件的标准,基于XML格式。
一.配置文件
1.服务器配置文件:
先来看一个服务器配置文件的实例,然后我再具体解释一下其中的内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
mode="Singleton"
type="RemotingConfigDemo.HelloServer, General"
objectUri="SayHello" />
</service>
<channels>
<channel port="8086" ref="http"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
在服务器配置文件中,最外层的元素是<configuration>,这是所有配置文件的共性(包括Web.config配置文件)。
所有的远程配置项必须作为子元素添加到<system.runtime.remoting>下面。
<application>元素使用name属性指定了服务器的名称,该应用程序提供了服务,并请求了服务的通道配置。
应用程序所提供的服务必须作为<service>的子元素列出,这就是远程对象本身,可以使用<wellknown>元素来指定远程对象,mode属性可以指定为SingleCall或Singleton,在后面我们会说到。同时用type属性来指定已经定义了类型的对象,只需要指定程序集的名称即可,不需要扩展名DLL。
在<channels>元素中,我们定义了服务器要使用的通道,用ref属性可以引用一个预先定义好的通道,同时必须使用port属性为通道分配端口,因为服务器必须有一个客户机所熟知的端口号,以便客户机可以利用该端口号。这些通道在机器配置文件中已经定义预先定义了6个,我们可以打开Machine.config文件看一下,默认的路径为%SystemRoot%\Microsoft.NET\Framework\<vx.x.x>\CONFIG。
2.客户机配置文件:
典型的客户机配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="RemotingConfigDemo.HelloServer, General" url="http://localhost:8086/SayHello" />
</client>
<channels>
<channel ref="http" port="0"></channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
同服务器配置文件的元素一样,不同的是这次是客户机通道,所以它不需要指定端口号,我们可以暂时指定为0号。其他的保持不变。
二.示例程序
1.远程对象代码:
using System;
using System.Text;
using System.Runtime.Remoting.Lifetime; namespace RemotingConfigDemo
{
public class HelloServer : MarshalByRefObject
{
public HelloServer()
{
Console.WriteLine("服务器激活……");
}
public String HelloMethod(String name)
{
Console.WriteLine(
"服务器端 :{0}", name);
return "这里是:" + name;
} }
}
2.服务器
配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
mode="Singleton"
type="RemotingConfigDemo.HelloServer, General"
objectUri="SayHello" />
</service>
<channels>
<channel port="8086" ref="http"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
服务器代码:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http; namespace RemotingConfigDemo
{ public class Server
{
public static int Main(string [] args)
{
RemotingConfiguration.Configure("Server.exe.config"); System.Console.WriteLine("按任意键退出……");
System.Console.ReadLine();
return ;
}
}
}
3.客户机
配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="RemotingConfigDemo.HelloServer, General" url="http://localhost:8086/SayHello" />
</client>
<channels>
<channel ref="http" port="0"></channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户机代码:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.IO; namespace RemotingConfigDemo
{
public class Client
{
public static void Main(string[] args)
{
//使用HTTP通道得到远程对象
RemotingConfiguration.Configure("Client.exe.config");
HelloServer obj2 = new HelloServer();
if (obj2 == null)
{
System.Console.WriteLine(
"连接HTTP服务器失败……");
} Console.WriteLine(
"Client2 HTTP HelloMethod {0}",
obj2.HelloMethod("Caveman2"));
Console.ReadLine();
}
}
}
三.需要注意的几点
1.程序集的名称常常会和存储程序集的文件的名称相混淆。程序集的名称是HelloServer,而程序集文件的名称是HelloServer.dll。使用方法调用时,需要将程序集的名称作为参数,而不需要使用文件的扩展名。
2.必须将远程对象类的程序集复制到服务程序的可执行文件的目录中,或是通过添加DLL引用。因为通过读取配置文件,将实例化远程框架中的这个远程对象类,程序集必须位于能够被找到的位置。
3.一般来说,我们可以让应用程序的配置文件名和可执行文件的文件名相同,其后跟有文件扩展名.config。
4.如果用App.config作为服务器或客户机配置文件,要注意App.config文件在运行后自动变为[应用程序名].exe.config。
5.为了防止配置文件找不到,我们可以在项目的属性中设置,在生成后事件里面填写拷贝目录语句:
copy "$(ProjectDir)\*.config" "$(TargetDir)"如图:
6.在编码中,可以不要把配置文件名硬编码写死,用如下语句来代替,这是一个很好的编程实践,也是值得推荐的一种写法。
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile7.最后一点,也是最重要的一点,推荐在项目中使用配置文件!
出处:http://www.cnblogs.com/Terrylee/archive/2005/11/17/278366.html
使用.NET Remoting开发分布式应用——配置文件篇的更多相关文章
- 使用.NET Remoting开发分布式应用——基于租约的生存期
一.概述 知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉,因为它没有保持状态,属于无状态的.而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长的对 ...
- 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用
一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...
- 初识用.NET Remoting来开发分布式应用
一..NET Remoting简介: .NET Remoting从某种意义上讲是DCOM的替代品.ASP.NET Web服务十分有用,但是这项技术在企业内联网的解决方案中,对于某些业务请求来说并不快, ...
- 跟我一起学WCF(3)——利用Web Services开发分布式应用
一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...
- Spring Boot 揭秘与实战(四) 配置文件篇 - 有哪些很棒的特性
文章目录 1. 使用属性文件2. YAML文件 1.1. 自定义属性 1.2. 参数引用 1.3. 随机数属性 1.4. application-{profile}.properties参数加载 3. ...
- C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...
- 利用Web Services开发分布式应用
一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 We ...
- Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...
随机推荐
- GitLab 安装与入门
GitLab介绍: GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. GitLab拥有与Github ...
- ubuntu 16.04 vscode + php debug
1.vscode 安装PHP Debug扩展: 2.php环境配置: 1.安装xdebug扩展: sudo apt-get install php-xdebug 2.找到扩展的路径: chq@chq- ...
- SQLServer行列转换PIVOT函数中聚合函数的使用意义及选择
例子:https://blog.csdn.net/wikey_zhang/article/details/76849826 DECLARE @limitDay INT;SET @limitDay = ...
- Java多线程 - 线程同步
多线程操作同一个对象时,容易引发线程安全问题.为了解决线程安全问题,Java多线程引入了同步监视器. 同步代码块 同步代码块语法格式如下: synchronized(obj){ //此处的代码即为同步 ...
- Python 乘法口诀表
环境 Anaconda3 Python 3.6, Window 64bit 目的 输出9*9 乘法口诀表 代码 # -*- coding: utf-8 -*- ''' 1*1=1 2*1=2 2*2= ...
- yii2: 点击编辑后,左侧的连接(a.navtab)失效,变成在新窗口打开
如:图一 使用a.navtab的时候,点击[自定义回复]->右侧列表,随便编辑一个,完成后 图二: 再点击,左侧的菜单,打开iframe就会失败,直接在新窗口打开.源代码如下: 造成这样的原因是 ...
- yii2:redis调用
参照手册,调用redis,报错,真坑: Yii::$app->redis 后改改用: Yii::getRedis();
- C++(二十三) — 内存泄漏及指针悬挂
1.内存泄漏 动态申请的内存空间没有正常释放,但也不能继续使用. ; pch1 = new char('A'); // 此处申请的空间未被释放. char *pch2 = new char; pch1 ...
- [java插件]myeclipse添加插件
在C:\Program Files\MyEclipse 6.0\eclipse\links里建立一个svn.link. svn.link文件内容: path=C:/Program Files/MyEc ...
- iOS调试技巧(debug)
说到debug,可以说到的东西就太多了,一个程序员,即使逻辑非常出色,也会出现bug问题,那么debug是每个程序员必备的技巧,尤其是Xcode开发, 苹果公司的开发的Xcode真的是十分强大 ...