随着.NET的推出,微软引入了一套新的通讯技术:Web Services和.NET remoting。.NET remoting和ASP.NET Web Services可以为建立分布式的应用提供强有力的支持。因此,为了在我们的应用程序中选择合适的技术,充分理解这两种技术的工作原理是非常必要的。

Web Service技术使用了HTTP、XML和SOAP技术进行通讯,因此,Web Service是跨平台的和真正的跨越防火墙的B2B应用集成技术。由于Web Services需要依赖商业标准在Internet上提供服务,因此,这种技术是语言、平台和设备独立的。Remoting技术可以允许程序和软件通过应用程序域、进程和不同机器之间进行交互。这将使我们的应用程序可以使用在网络环境中的远程资源。

Web Services和remoting技术都支持开发分布试的应用程序和应用程序集成,但是我们需要考虑的是它们有哪些不同。在本文中将给出这两种技术的不同点,并为每一种实现给出实例以供读者更深入地理解这两种技术。

一、.NET Remoting 概述

.NET Remoting使用了一种非常有弹性的扩展性的框架。Remoting使用了.NET的一个应用程序域(AppDomain)的概念来确定它的活动性。AppDomain是一个抽象的结构,用来保证数据和代码的隔离,但并不依赖于操作系统的特殊概念,如进程或线程。一个进程可以包含多个AppDomains,但是一个AppDomain只能存在于一个进程。如果在程序中通过AppDomain调用,那么.NET Remoting将获得这个位置。如果一个对象位于同一个AppDomain中,那么这个对象被认为是本地的对象。

在.NET remoting中,所有继承于System.MarshalByRefObject的类的对象都被视为远程对象。MarshalByRefObject类提供了通过应用程序域访问远程对象的基本功能。在.NET remoting中,客户端不会直接调用方法,而是使用一个协议对象作为中转来调用远程对象中的方法。每一个在远程对象中定义的public方法都可以被客户端调用。图1为.Net Remoting的构架图:

图1

当客户端调用远程方法时,代理首先会接收这个调用。并使用一个适当的格式来对这些调用信息进行编码,然后通过Channel将调用送到服务器。在服务端AppDomain的一个Channel接收了这个请求,并将这个请求交给了适当的Remoting对象处理,并调用响应的方法。一位执行完方法,方法的返回值就会被送回到客户端。

Remoting框架由两种格式组成:二进制和SOAP格式。二进制格式是非常快的,并以适当的二进制格式来对方法进行编码调用。SOAP格式要比二进制格式慢,但是它允许开发人员使用SOAP格式来对远程信息进行编码。至于使用哪种方式,开发人员可以根据自己的需要决定。

二、远程对象的不同类型

远程构架允许我们建立两个不同类型的远程对象。

1. 客户端对象:这种类型的远程对象是一个在客户端进行创建和销毁的服务端对象。这种远程对象的实例在客户端调用服务端对象的一个新操作时创建。对象实例的生命周期和客户端有关。一但客户端不太需要远程对象后,这个对象就会被垃圾回收器回收。

2. 服务端对象:这种对象的生命周期被远程服务器管理,而并不是由客户端创建的对象。这种对象和客户端对象的区别是当对象完成工作后,远程对象由客户端控制。也就是说,当客户端调用新的远程对象或是Activator.GetObject时,服务端对象并不被创建。有两种类型的服务端对象。它们是:

(1) 独享调用:这种调用方式对于一个客户端的请求只使用一个新的远程对象。在处理完客户端请求后,这个远程对象就会被垃圾回收器回收。因此,这个远程对象并不会在两个或以上的客户端请求中共享。

(2) 共享调用:这种调用方式和独享调用的区别是这种方式可以在不同请求之间共享远程对象实例,而独享调用对每一个客户端请求创建一个单独的远程对象。

三、ASP.NET Web Services概述

在.NET中建立一个ASP.NET Web Service是一项非常简单的工作。为了建立一个Web Service,我们需要建立一个Web Service类,这个类从System.Web.Services.WebService继承,并使用WebMethod属性公开一些Web Service方法。一但这项工作做完。这些方法就可以通过SOAP和HTTP协议进行调用。

使用一个Web Service也是非常简单和直接的。我们可以使用wsdl.exe或使用VS.NET的开发环境建立一个代理类。这个代理隐藏了调用了Web Service的复杂性,并使Web Service看起来就象是调用本地对象一样。

我们可以从上图看到。客户端代理从客户端接收到了请求,并将这个请求序列化成SOAP请求,并送到远程Web Service中。远程Web Service接收到SOAP请求后,开始执行这个方法,并以SOAP响应的形式将结果送回到客户端的代理,客户端代理对这些返回信息进行反序列化,并送给实际的客户端。

四、ASP.NET Web Services 和NET Remoting的对比

现在我们已经理解了.NET remoting和Web Services的基本概念。现在让我们来看看这两种技术有什么具体的不同。为了这个目的,我将它们的不同分为性能、状态管理等方面进行阐述。

1.  性能

从性能方面,.NET remoting在使用TCP通道和二进制格式时拥有更快的通讯速度。而关于Web Services的主要焦点就集中在性能上。由于XML的冗长而使得用SOAP协议序列化出来的传输数据要比二进制数据流更慢。另外,处理字符串要比直接处理二进制更慢。然而,如果我们的Web service要进行的工作主要是计算操作,可以在服务端使用缓冲技术来增加web service的性能。

如果我们使用一个SOAP格式的.NET remoting,我们会发现ASP.Net Web Service的性能会比使用SOAP协议的.NET remoting(可以使用http或tcp同道)更好。因此,.NET remoting技术只有在使用TCP通道和二进制格式时才比Web service的性能更高。

2. 状态管理

Web services是一种无状态的编程模型,这就意味着需要单独处理每一个请求。另外,客户端每一次调用web services,服务端会为这个请求建立一个新的对象。这个对象在所有的方法调用完后销毁。为了在请求之间维护状态,我们可以使用和ASP.NET页同样的技术。如Session和Application对象,或是为我们的解决方案定制一个解决方案。但我们要清楚的是,在Web Service中维护状态的成本是非常高的。

.NET remoting支持多种方式的状态管理。我们可以从中选择适当的解决方案。在前面提到过,SingleCall对象是无状态的,Singleton对象可以共享所有客户端的状态,并且客户对象在每一个客户端维护状态。如果我们不需要维护状态,可以使用singlecall对象,如果我们需要维护状态,可以一起使用singlecall和singleleton对象。

3.  安全

.NET remoting并不支持跨平台的安全调用。但由于.NET remoting对象运行在IIS中,因此可以使用IIS的所有的安全特性。如果我们在其它的非IIS容器中使用TCP或HTTP通道,那么我们必须自已实现验证,授权等机制。

web service和.NET remoting一样,也运行在IIS中,同样也可以使用IIS所提供的安全机制,如SSL、授权等。

4. 可靠性

.NET remoting可以将任何程序作为远程对象,如Windows Form、服务程序、控制台或ASP.NET工作进程等。如果我们将Windows服务或控制台程序作为远程对象,那么我们需要确认所提供的服务特性是否符合远程对象的要求。然而如果我们在IIS中提供远程对象,那么我们可以利用ASP.NET工作进程的两个特性:自动开始和线程安全。对于ASP.NET Web service来说,可靠性并不是经常需要考虑的因素,因此它可以利用IIS在这方面的能力。

5. 可扩展性

ASP.NET Web services和.NET remoting框架都是可扩展的。我们可以过滤内部和外部的信息,控制各种类型的组件和元数据的产生。.NET remoting可以扩展到下一层,以允许我们实现自己的格式化程序和通道。

ASP.NET Web services依赖于System.Xml.Serialization.XmlSerializer类通过SOAP协议来发送和接收信息。我们可以非常容易地通过加入定制的属性来控制这一切。

五、实例

在这部分,我们将使用一个简单的例子来演示如何编写Web Services和远程对象。下面我们通过一个简单的远程对象开始我们的学习。

1. 建立一个远程对象

为了建立这个远程对象,我们需要写一个从MarshalByRefObject继承的。代码如下如示:

using System;

namespace RemoteClassLib

{

public class MyRemoteObject : System.MarshalByRefObject

{

public MyRemoteObject()

{

Console.WriteLine("Constructor called");

}

public string Hello(string name)

{

Console.WriteLine("Hello Called");

return "Hello " + name;

}

}

}

上面的代码非常简单和直接。一开始有一个从MarshalByRefObject.继承的类。然后我们加入了这个类的构造方法,并将一条信息输出到控制台。然后我们写一个Hello方法用于返回一个值。一但这个远程对象被建立,下一步就是建立一个控制台应用程序来从配置文件中读远程对象的信息。

using System;

using System.Runtime.Remoting;

namespace RemoteClassLibServer

{

class RemoteServer

{

[STAThread]

static void Main(string[] args)

{

RemotingConfiguration.Configure(

"RemoteClassLibServer.exe.config");

Console.WriteLine("Press return to Exit");

Console.ReadLine();

}

}

}

在上面的main方法中,我们只是使用RemotingConfiguration.Configure方法从配置文件中读入配置信息。并等待客户端连接它。上面所使用的配置文件的形式如下:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

   <system.runtime.remoting>

      <application name="RemoteClassLibServer">

      <service>

        <wellknown mode="SingleCall"

type="RemoteClassLib.MyRemoteObject,RemoteClassLib"

         objectUri="MyRemoteObject">

         </wellknown>

      </service>

      <channels>

         <channel ref="tcp server" port=""/>

</channels>

      </application>

   </system.runtime.remoting>

</configuration>

一但服务器程序被启动,然后这个客户端应用程序就可以开始建立远程对象的实例,并且调用相应的方法。在下一部分,我们将理解建立ASP.NET web services的过程。

2. 建立一个ASP.NET Web Service

在前面曾提及,使用VS.NET建立一个ASP.NET Web Service是非常容易的。只需要使用ASP.NET Web Service模板建立一个Web Service工程。并输入工程名。一位工程被建立。将service1.asmx文件的内容为如下的形式:

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.Web;

using System.Web.Services;

namespace XmlWebServicesExample

{

public class Service1 : System.Web.Services.WebService

{

public Service1()

{

}

[WebMethod (EnableSession=true)]

public string HelloWorld()

{

return "Hello World";

}

}

}

我们可以从上面的代码看出,Web Service类名为Service1,从System.Web.Services.WebService继承。从WebService类继承是可选的,这主要是为了可以访问类似的ASP.NET对象,如Application、Session、User和Context。然后我们还加入了一个叫HelloWorld的方法,这个方法返回一个简单的字符串给Web Service的调用者。在HelloWorld方法的WebMethod属性中,我们还通过EnableSessionn属性指定ASP.NET Web service的会话状态为打开。

六、结论

.NET remoting和ASP.NET Web Service都是非常强大的技术,这两种技术都提供了适当的框架来开发分布式的应用程序。充分理解这两种技术如何工作,并如何正确选择它们是非常重要的。如果应用程序要求互操作性,并且必须在公共网络中,Web Services将是最好的选择。如果要求和其他的.NET组件进行通讯,并且性能非常关键,那么.NET Remoting技术是最好的选择。总而言之,当我们需要从不同的计算平台发送和接收数据时,使用Web Service,而需要在.NET应用程序之间进行通讯时,就需要使用.NET remoting技术。在一些应用环境中,我们可以将Web Service和.NET remoting联合起来使用。这样会有更好的效果。

本文欢迎转载,转载请注明:转载自IT168 [ http://www.it168.com/ ]

.Net Remoting和Web Service大比拼的更多相关文章

  1. WCF、Net remoting、Web service概念及区别

    Windows通信基础(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit ...

  2. WCF、.Net Remoting、Web Service概念及区别

    此文章主要参考http://www.cnblogs.com/weiweibtm/archive/2013/06/21/3148583.html 参考书籍<WCF全面解析上册>.<WC ...

  3. 测试Remoting三种信道Http,Tcp,Ipc和Web Service的访问速度 (转)

    Remoting和Web Service是.net中的重要技术,都可用来实现分布式系统开发,如果是不同的平台就只能选择Web Service,但如果是同一平台,就都可以选择了.到底选择那种,当然还有访 ...

  4. .NET Remoting三种信道Http,Tcp,IPC和Web Service的访问速度比较(转)

    Remoting和Web Service是.net中的重要技术,都可用来实现分布式系统开发,如果是不同的平台就只能选择Web Service,但如果是同一平台,就都可以选择了.到底选择那种,当然还有访 ...

  5. Web Service和WCF的区别。其实二者不属于一个范畴!!!

    Web Service和WCF的区别 [1]Web Service:严格来说是行业标准,也就是Web Service 规范. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XML扩展 ...

  6. wcf和web service的区别

    1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...

  7. Web Service和WCF的到底有什么区别

    [1]Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XM ...

  8. WCF和Web Service的 区(guan)别(xi)

    参考文献:http://social.microsoft.com/Forums/zh-CN/c06420d1-69ba-4aa6-abe5-242e3213b68f/wcf-webservice 之前 ...

  9. 关于.Net Remoting 和 Web Servcie的比较

    参照文献 http://www.cnblogs.com/shinehouse/articles/3001955.html http://www.cnblogs.com/paper/archive/20 ...

随机推荐

  1. [洛谷P3811]【模板】乘法逆元

    P3811 [模板]乘法逆元 题意 求1-n所有整数在模p意义下的逆元. 分析 逆元 如果x满足\(ax=1(\%p)\)(其中a p是给定的数)那么称\(x\)是在\(%p\)意义下\(a\)的逆元 ...

  2. Caesars Cipher

    让上帝的归上帝,凯撒的归凯撒. 下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码. 移位密码也就是密码中的字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母 ...

  3. node.js利用express连接mysql数据库

    我们创建一个mysql.js (好像大神们,称呼这叫一个模块,然后暴露一个接口)用来连接数据库 var connction ={}; connction.mysql = { host:"lo ...

  4. C# 设计模式巩固 - 抽象工厂模式

    前言   继续工厂模式高级版,抽象工厂模式.抽象工厂模式其实是从工厂方法模式拓展而来.在实际的生活中一个工厂的产品不可能是单一的,肯定是多种系列的产品. 介绍 - 抽象工厂模式 定义:(摘自百度百科~ ...

  5. Node.js 全栈开发(二)——ES 201x 新语法的使用之基础篇

    在讲 ES 2015 新语法之前,先来说一下为什么叫 ES.JavaScript 是这门语言的名称,它有一个为它制定标准化的组织 European Computer Manufacturers Ass ...

  6. LeetCode OJ:Tenth Line(文件第十行)

    How would you print just the 10th line of a file? For example, assume that file.txt has the followin ...

  7. 【移动互联网开发】Zepto 使用中的一些注意点 【转】

    前段时间完成了公司一个产品的 HTML5 触屏版,开发中使用了 Zepto 这个著名的 DOM 操作库. 为什么不是 jQuery 呢?因为 jQuery 的目标是兼容所有主流浏览器,这就意味着它的大 ...

  8. ubuntu15.10运行android studio出错unable to run mksdcard sdk tool

    问题:ubuntu运行android studio出错unable to run mksdcard sdk tool 系统版本:系统是ubuntu 15.10 64位 确认原因:缺少lib 解决方法: ...

  9. Linux下常用压缩、解压缩命令

    常用的压缩工具 一是单纯的单文件压缩工具,主要有compress,gzip,bzip2. 二是打包压缩工具,也是最常用的,tar 压缩比:compress<gzip<bzip2    co ...

  10. Linux:cd命令详解

    cd 用来变更用户所在目录的 绝对路径:路径的写法一定由根目录 "/" 写起.例如 /usr/local/mysql 这就是绝对路径.相对路径:路径的写法不是由根目录 " ...