使用.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 0;
        }
    }
}

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.ConfigurationFile

7.最后一点,也是最重要的一点,推荐在项目中使用配置文件!

出处:http://www.cnblogs.com/Terrylee/archive/2005/11/17/278366.html

时间: 2024-08-10 16:29:39

使用.NET Remoting开发分布式应用——配置文件篇的相关文章

使用.NET Remoting开发分布式应用——基于租约的生存期

一.概述 知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉,因为它没有保持状态,属于无状态的.而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长的对象,如果在客户程序停止使用远程对象之前,远程对象被禁用了,则客户程序会得到一个RemotingException异常.因为该对象已经和下一个方法调用(从客户程序进行的方法调用)断开了连接,只要客户程序需要该对象,它就必须被激活. 微软的DCOM技术使用了Ping机制,在这种机制下,客户程序有规律的对

跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 .NET Remoting简介 .NET REmoting与MSMQ不同,它不支持离线可得,另外只适合.NET平台的程序进行通信.它提供了一种允许对象通过应用程序域与另一个对象进行交互的框架..NET 应用程序都在一个主应用程序域中执行的,在一个应用程序域中的代码不能访问另一个应用程序域的数据,然而在

初识用.NET Remoting来开发分布式应用

一..NET Remoting简介: .NET Remoting从某种意义上讲是DCOM的替代品.ASP.NET Web服务十分有用,但是这项技术在企业内联网的解决方案中,对于某些业务请求来说并不快,也没有足够的灵活性,而且,ASP.NET Web服务需要有运行时的支持.使用.NET Remoting技术后,可以将Web服务提供给世界上的任何地方.而且可以在所有的应用程序类型中运行Web服务. 二..NET Remoting 的基本原理: 体系结构图如下: 三.几个重要的概念: 1.远程对象:

跟我一起学WCF(3)——利用Web Services开发分布式应用

一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 Web Services 概述 Web Services是支持客户端与服务器通过网络互操作的一种软件系统,是一组可以通过网络调用的应用程序API.在Web Services中主要到SOAP/UDDI/WSDL这三个核心概念,下面分别介绍下这三个概念的定义. SOAP:SOAP(Simple Object

Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇) 本文主要内容: (1)SpringMVC校验 (2)数据回显 (3)异常处理器 (4)图片上传 (5)Json数据交互 (6)支持RESTful 1.SpringMVC校验 1.1校验理解 项目中,通常使用较多的是前端的校验,比如页面中js校验.对于安全要求较高的

Spring Boot 揭秘与实战(四) 配置文件篇 - 有哪些很棒的特性

文章目录 1. 使用属性文件2. YAML文件 1.1. 自定义属性 1.2. 参数引用 1.3. 随机数属性 1.4. application-{profile}.properties参数加载 3. 源代码 Spring 框架本身提供了多种的方式来管理配置属性文件.Spring 3.1 之前可以使用 PropertyPlaceholderConfigurer.Spring 3.1 引入了新的环境(Environment)和概要信息(Profile)API,是一种更加灵活的处理不同环境和配置文件

利用Web Services开发分布式应用

一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 Web Services 概述 Web Services是支持客户端与服务器通过网络互操作的一种软件系统,是一组可以通过网络调用的应用程序API.在Web Services中主要到SOAP/UDDI/WSDL这三个核心概念,下面分别介绍下这三个概念的定义. SOAP:SOAP(Simple Object

Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是很完全所以导致部分同学在有些地方做开发的时候遇到了一些阻力,收到这些朋友同学们的咨询反馈之后我也做了一些反思和总结,其中一部分同学说少了GlobalConstants这个文件(这个真心占的不少),还有一部分就是说源码的问题,所以今天特意抽了时间补充下这两点! (一)关于GlobalConstants

Android Metro风格的Launcher开发系列第二篇

前言: 各位小伙伴们请原谅我隔了这么久才开始写这一系列的第二篇博客,没办法忙新产品发布,好了废话不说了,先回顾一下:在我的上一篇博客Android Metro风格的Launcher开发系列第一篇写了如何配置Android开发环境,只是用文字和图片展示了开发Metro风格Launcher的初步设计和产品要求,这一篇文章将会从代码上讲解如何实现对应的UI效果,好了,评书开讲! Launcher主体框架实现: Launcher主体框架我选用的是大家所熟悉的ViewPager控件,因为ViewPager