服务器托管与维护费用分析——揭示服务器托管与服务的区别
一、引言
随着互联网技术的飞速发展,服务器托管与维护成为了企业和个人运营网站、应用程序等不可或缺的一环。
服务器托管和服务都是确保服务器正常运行、数据安全以及提供高效性能的关键服务,但它们之间存在一定差异。
本文将重点分析服务器托管与维护的费用,并探讨服务器托管与服务的区别。
二、服务器托管概述
服务器托管是指将服务器硬件设备放置在专业的数据中心或托管服务提供商处,由他们负责管理和维护服务器的运行。
服务器托管服务通常包括硬件设备的维护、系统更新、安全保护、带宽保障等方面。
托管服务提供商会为客户提供灵活的服务选项,以满足不同需求。
三、服务器维护费用分析
服务器维护费用涉及多个方面,主要包括以下几个方面:
1. 硬件维护:包括服务器硬件设备的检测、故障诊断与修复等。由于服务器硬件设备的性能和稳定性对于业务运营至关重要,因此硬件维护费用相对较高。
2. 系统更新与升级:为了确保服务器的安全性和性能,需要定期进行系统更新和升级。这部分费用取决于操作系统的类型和版本,以及更新和升级的频率。
3. 安全防护:为了防范各种网络攻击和数据泄露,需要投入一定的费用进行安全防护,如安装和更新安全软件、定期进行安全检测等。
4. 带宽保障:为了确保服务器的访问速度和稳定性,需要购买足够的带宽资源。带宽费用取决于服务器的需求量和所选服务提供商的定价策略。
四、服务器托管费用分析
服务器托管费用主要包括以下几个方面:
1. 基础设施费用:包括服务器硬件设备的购置、数据中心的使用等费用。托管服务提供商会按照服务器的配置和性能收取相应的费用。
2. 服务支持费用:托管服务提供商会为客户提供专业的技术支持和服务,包括问题解决、系统监控等。服务支持费用根据服务提供商的定价策略和服务内容而定。
3. 带宽和网络费用:托管服务提供商通常会提供一定的带宽资源,并按照需求量收取相应的费用。还可能涉及网络设备的租赁和维护费用。
五、服务器托管与服务的区别
尽管服务器托管和服务都是为了确保服务器的正常运行和性能,但它们之间存在明显的区别:
1. 范围不同:服务器托管主要涉及服务器的物理放置和管理,而服务则涵盖了更广泛的内容,包括硬件维护、系统更新、安全防护等各个方面。
2. 费用结构不同:服务器托管的费用主要涉及到基础设施的使用和服务支持,而服务的费用则更加多样化,包括硬件维护、系统更新等各个模块的费用。
3. 专业程度不同:托管服务提供商通常拥有专业的技术团队和设施,能够提供更专业的服务。而服务则可能根据客户需求进行定制,提供更加个性化的解决方案。
六、结论
通过对服务器托管与维护费用的分析,我们可以发现服务器托管与服务之间存在明显的区别。
在选择服务器托管或服务时,企业或个人应根据自身需求和预算进行权衡。
对于需要专业管理和维护的企业,选择服务器托管可能更为合适;而对于需要个性化服务和灵活定制的客户,选择服务可能更加适合。
了解服务器托管与服务的区别及费用结构,有助于企业或个人做出更明智的决策。
服务器租用和托管两者有什么关联?
并没有什么关联,区别倒是有。
服务器租用是由数据中心提供服务器,只能有一个客户或者是网站通过租用方式使用它,并且由Internet数据中心替客户进行管理维护。
您轻松享受从设备、环境到维护的一整套服务。
服务器托管是客户自身拥有一台服务器,并把它放置在Internet数据中心的机房,由客户自己进行维护,或者是由其它的签约人进行远程维护。
两者相比,整机租用在成本和服务方面的优势更为显著。
它让您起步更轻松,不仅综合性价比更优良,且有很好的可扩展性和多样化的选择服务器品牌和操作系统。
Java中 什么情况下使用接口?什么情况下使用抽象类?各自的优势是什么?
抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。
abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。
其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。
本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。
一、理解抽象类 abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢? 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。
并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。
正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。
我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。
这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。
模块可以操作一个抽象体。
由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。
熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
二、从语法定义层面看abstract class和interface 在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。
使用abstract class的方式定义Demo抽象类的方式如下: abstract class Demo { abstract void method1(); abstract void method2(); … } 使用interface的方式定义Demo抽象类的方式如下: interface Demo { void method1(); void method2(); … } 在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。
从某种意义上说,interface是一种特殊形式的abstract class。
从编程的角度来看,abstract class和interface都可以用来实现design by contract的思想。
但是在具体的使用上面还是有一些区别的。
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。
但是,一个类却可以实现多个interface。
也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予方法的默认行为。
但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。
在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。
因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。
但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了one rule,one place原则,造成代码重复,同样不利于以后的维护。
因此,在abstract class和interface间进行选择时要非常的小心。
三、从设计理念层面看abstract class和interface 上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。
本文将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。
作者认为,从这个层面进行分析才能理解二者概念的本质所在。
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在is a关系,即父类和派生类在概念本质上应该是相同的。
对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。
为了使论述便于理解,下面将通过一个简单的实例进行说明。
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示: 使用abstract class方式定义Door: abstract class Door { abstract void open(); abstract void close(); } 使用interface方式定义Door: interface Door { void open(); void close(); } 其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。
看起来好像使用abstract class和interface没有大的区别。
如果现在要求Door还要具有报警的功能。
我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。
解决方案一: 简单的在Door的定义中增加一个alarm方法,如下: abstract class Door { abstract void open(); abstract void close(); abstract void alarm(); } 或者 interface Door { void open(); void close(); void alarm(); } 那么具有报警功能的AlarmDoor的定义方式如下: class AlarmDoor extends Door { void open() { … } void close() { … } void alarm() { … } } 或者 class AlarmDoor implements Door { void open() { … } void close() { … } void alarm() { … } } 这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念报警器的行为方法混在了一起。
这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为报警器这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。
解决方案二: 既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。
定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。
显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。
后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。
我们一一来分析、说明。
如果两个概念都使用interface方式来定义,那么就反映出两个问题: 1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器? 2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。
如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。
我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是is a关系。
所以对于Door这个概念,我们应该使用abstarct class方式来定义。
另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。
如下所示: abstract class Door { abstract void open(); abstract void close(); } interface Alarm { void alarm(); } class AlarmDoor extends Door implements Alarm { void open() { … } void close() { … } void alarm() { … } } 这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。
其实abstract class表示的是is a关系,interface表示的是like a关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。
abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。
但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。
这其实也是语言的一种的惯用法,希望读者朋友能够细细体会
Microsoft.NETFramework的作用
Framework Framework 概述请参见 使用 Framework 编程 | 快速入门 | 示例 | 教程 Framework 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发。
Framework 旨在实现下列目标: 提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。
提供一个将软件部署和版本控制冲突最小化的代码执行环境。
提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境。
提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。
使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。
按照工业标准生成所有通信,以确保基于 Framework 的代码可与任何其他代码集成。
Framework 具有两个主要组件:公共语言运行库和 Framework 类库。
公共语言运行库是 Framework 的基础。
您可以将运行库看作一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。
事实上,代码管理的概念是运行库的基本原则。
以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。
Framework 可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。
Framework 不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。
例如, 承载运行库以为托管代码提供可伸缩的服务器端环境。
直接使用运行库以启用 应用程序和 XML Web services(本主题稍后将对这两者进行讨论)。
Internet Explorer 是承载运行库(以 MIME 类型扩展的形式)的非托管应用程序的一个示例。
使用 Internet Explorer 承载运行库使您能够在 HTML 文档中嵌入托管组件或 Windows 窗体控件。
以这种方式承载运行库使得托管移动代码(类似于 Microsoft? ActiveX? 控件)成为可能,但是它具有只有托管代码才能提供的重大改进(如不完全受信任的执行和安全的独立文件存储)。
下面的插图显示公共语言运行库和类库与应用程序之间以及与整个系统之间的关系。
该插图还显示托管代码如何在更大的结构内运行。
Framework 环境 下面的章节将更加详细地描述 Framework 的主要组件和功能。
公共语言运行库的功能 公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。
这些功能是在公共语言运行库上运行的托管代码所固有的。
至于安全性,取决于包括托管组件的来源(如 Internet、企业网络或本地计算机)在内的一些因素,托管组件被赋予不同程度的信任。
这意味着即使用在同一活动应用程序中,托管组件既可能能够执行文件访问操作、注册表访问操作或其他须小心使用的功能,也可能不能够执行这些功能。
运行库强制实施代码访问安全。
例如,用户可以相信嵌入在 Web 页中的可执行文件能够在屏幕上播放动画或唱歌,但不能访问他们的个人数据、文件系统或网络。
这样,运行库的安全性功能就使通过 Internet 部署的合法软件能够具有特别丰富的功能。
运行库还通过实现称为通用类型系统 (CTS) 的严格类型验证和代码验证基础结构来加强代码可靠性。
CTS 确保所有托管代码都是可以自我描述的。
各种 Microsoft 和第三方语言编译器生成符合 CTS 的托管代码。
这意味着托管代码可在严格实施类型保真和类型安全的同时使用其他托管类型和实例。
此外,运行库的托管环境还消除了许多常见的软件问题。
例如,运行库自动处理对象布局并管理对对象的引用,在不再使用它们时将它们释放。
这种自动内存管理解决了两个最常见的应用程序错误:内存泄漏和无效内存引用。
运行库还提高了开发人员的工作效率。
例如,程序员可以用他们选择的开发语言编写应用程序,却仍能充分利用其他开发人员用其他语言编写的运行库、类库和组件。
任何选择以运行库为目标的编译器供应商都可以这样做。
以 Framework 为目标的语言编译器使得用该语言编写的现有代码可以使用 Framework 的功能,这大大减轻了现有应用程序的迁移过程的工作负担。
尽管运行库是为未来的软件设计的,但是它也支持现在和以前的软件。
托管和非托管代码之间的互操作性使开发人员能够继续使用所需的 COM 组件和 DLL。
运行库旨在增强性能。
尽管公共语言运行库提供许多标准运行库服务,但是它从不解释托管代码。
一种称为实时 (JIT) 编译的功能使所有托管代码能够以它在其上执行的系统的本机语言运行。
同时,内存管理器排除了出现零碎内存的可能性,并增大了内存引用区域以进一步提高性能。
最后,运行库可由高性能的服务器端应用程序(如 Microsoft? SQL Server? 和 Internet 信息服务 (IIS))承载。
此基础结构使您在享受支持运行库宿主的行业最佳企业服务器的优越性能的同时,能够使用托管代码编写业务逻辑。
Framework 类库 Framework 类库是一个与公共语言运行库紧密集成的可重用的类型集合。
该类库是面向对象的,并提供您自己的托管代码可从中导出功能的类型。
这不但使 Framework 类型易于使用,而且还减少了学习 Framework 的新功能所需要的时间。
此外,第三方组件可与 Framework 中的类无缝集成。
例如, Framework 集合类实现一组可用于开发您自己的集合类的接口。
您的集合类将与 Framework 中的类无缝地混合。
正如您对面向对象的类库所希望的那样, Framework 类型使您能够完成一系列常见编程任务(包括诸如字符串管理、数据收集、数据库连接以及文件访问等任务)。
除这些常见任务之外,类库还包括支持多种专用开发方案的类型。
例如,可使用 Framework 开发下列类型的应用程序和服务: 控制台应用程序。
Windows GUI 应用程序(Windows 窗体)。
应用程序。
XML Web services。
Windows 服务。
例如,Windows 窗体类是一组综合性的可重用的类型,它们大大简化了 Windows GUI 的开发。
如果要编写 Web 窗体应用程序,可使用 Web 窗体类。
客户端应用程序开发 客户端应用程序在基于 Windows 的编程中最接近于传统风格的应用程序。
这些是在桌面上显示窗口或窗体从而使用户能够执行任务的应用程序类型。
客户端应用程序包括诸如字处理程序和电子表格等应用程序,还包括自定义的业务应用程序(如数据输入工具、报告工具等等)。
客户端应用程序通常使用窗口、菜单、按钮和其他 GUI 元素,并且它们可能访问本地资源(如文件系统)和外围设备(如打印机)。
另一种客户端应用程序是作为 Web 页通过 Internet 部署的传统 ActiveX 控件(现在被托管 Windows 窗体控件所替代)。
此应用程序非常类似于其他客户端应用程序:它在本机执行,可以访问本地资源,并包含图形元素。
过去,开发人员将 C/C++ 与 Microsoft 基础类 (MFC) 或应用程序快速开发 (RAD) 环境(如 Microsoft? Visual Basic?)一起使用来创建这样的应用程序。
Framework 将这些现有产品的特点合并到了单个且一致的开发环境中,该环境大大简化了客户端应用程序的开发。
包含在 Framework 中的 Windows 窗体类旨在用于 GUI 开发。
您可以轻松创建具有适应多变的商业需求所需的灵活性的命令窗口、按钮、菜单、工具栏和其他屏幕元素。
例如, Framework 提供简单的属性以调整与窗体相关联的可视属性。
某些情况下,基础操作系统不支持直接更改这些属性,而在这些情况下, Framework 将自动重新创建窗体。
这是 Framework 集成开发人员接口从而使编码更简单更一致的许多方法之一。
和 ActiveX 控件不同,Windows 窗体控件具有对用户计算机的不完全受信任的访问权限。
这意味着二进制代码或在本机执行的代码可访问用户系统上的某些资源,例如 GUI 元素和访问受限制的文件,但这些代码不能访问或危害其他资源。
由于具有代码访问安全性,许多曾经需要安装在用户系统上的应用程序现在可以通过 Web 安全地部署。
您的应用程序可以在像 Web 页那样部署时实现本地应用程序的功能。
服务器应用程序开发 在托管领域中,服务器端应用程序是通过运行库宿主实现的。
非托管应用程序承载公共语言运行库,后者使您的自定义托管代码可以控制服务器的行为。
此模型在获得主服务器的性能和可伸缩性的同时提供给您公共语言运行库和类库的所有功能。
下面的插图显示在不同服务器环境中运行托管代码的基本网络架构。
在应用程序逻辑通过托管代码执行时,服务器(如 IIS 和 SQL Server)可执行标准操作。
服务器端托管代码 是使开发人员能够使用 Framework 开发基于 Web 的应用程序的宿主环境。
但是, 不止是一个运行库宿主;它是使用托管代码开发 Web 站点和通过 Internet 分布的对象的完整结构。
Web 窗体和 XML Web services 都将 IIS 和 用作应用程序的发布机制,并且两者在 Framework 中都具有支持类集合。
XML Web services 作为基于 Web 的技术的重要发展,是类似于常见 Web 站点的分布式服务器端应用程序组件。
但是,与基于 Web 的应用程序不同,XML Web services 组件不具有 UI 并且不以浏览器(如 Internet Explorer 和 Netscape Navigator)为目标。
XML Web services 由旨在供其他应用程序使用的可重用的软件组件组成,所谓的其他应用程序包括:传统的客户端应用程序,基于 Web 的应用程序,甚至是其他 XML Web services。
因此,XML Web services 技术正迅速地将应用程序开发和部署推向高度分布式 Internet 环境。
如果您使用过 ASP 技术的早期版本,很快就会注意到 和 Web 窗体提供的改进。
例如,您可以用支持 Framework 的任何语言开发 Web 窗体页。
此外,您的代码不再需要与 HTTP 文本共享同一个文件(尽管如果您愿意,代码还可以继续这样做)。
Web 窗体页用本机语言执行,这是因为与所有其他托管应用程序一样,它们充分利用运行库。
与此相对照,非托管 ASP 页始终被写成脚本并解释。
页比非托管 ASP 页更快、更实用并且更易于开发,这是因为它们像所有托管应用程序一样与运行库进行交互。
Framework 还提供类和工具的集合来帮助开发和使用 XML Web services 应用程序。
XML Web services 是基于 SOAP(一种远程过程调用协议)、XML(一种可扩展的数据格式)和 WSDL(Web 服务描述语言)这些标准生成的。
基于这些标准生成 Framework 的目的是为了提高与非 Microsoft 解决方案的互操作性。
例如, Framework SDK 所包含的 Web 服务描述语言工具可以查询在 Web 上发布的 XML Web services,分析它的 WSDL 描述,并产生 C# 或 Visual Basic 源代码,您的应用程序可以使用这些代码而成为 XML Web services 的客户端。
这些源代码可以创建从类库中的类派生的类,这些类使用 SOAP 和 XML 分析处理所有基础通信。
虽然您可以使用类库来直接使用 XML Web services,Web 服务描述语言工具和包含在 SDK 中的其他工具可以使您更加方便地用 Framework 进行开发。
如果您开发和发布自己的 XML Web services, Framework 为您提供了一组符合所有基础通信标准(如 SOAP、WSDL 和 XML)的类。
使用这些类使您能够将注意力集中在服务的逻辑上,而无需关注分布式软件开发所需要的通信基础结构。
最后,与托管环境中的 Web 窗体页相似,您的 XML Web services 将使用 IIS 的可伸缩通信以本机语言的速度运行。