远程处理中的版本信息
远程处理是为与带强名称的程序集一起使用而设计的。将强名称用于远程处理时,下列基本规则适用:
版本始终包含在 IMethodCallMessage 接口实现的 TypeName 属性中。
版本始终包含在 IConstructionCallMessage 接口实现的 ActivationTypeName 属性中。
远程处理中的所有其他版本控制由所使用的格式化程序的 includeVersions 属性确定。默认情况下,BinaryFormatter 对象生成版本控制信息,而 SoapFormatter 对象则不生成版本控制信息。此属性可在创建信道时以编程方式更改,还可通过远程处理配置文件来设置。
本节描述这些规则如何影响对象引用以及远程处理中常用的不同激活模型。
服务器激活的对象
服务器控制在客户端连接到服务器激活的(或 <wellknown>)对象时激活的类型版本。如果在配置服务时未提供任何版本信息,则在激活对象时使用最新的程序集版本。例如,如果您具有两个程序集 MyHello 1.0.0.0 版和 MyHello 2.0.0.0 版,则使用版本 2 程序集激活已知对象(如果没有提供版本信息)。应该注意的是,此版本的使用与生成客户端时所引用的版本无关。
可配置此服务以使用程序集的特定版本。例如,下面的配置文件显示如何指定版本。请注意,如果程序集位于全局程序集缓存中,则必须指定所有类型信息,其中包括区域性信息和公钥。为了集中介绍版本控制,以下配置示例省略了强名称信息。
<configuration>
<system.runtime.remoting>
<application name="RemotingHello">
<lifetime
leaseTime="20ms"
sponsorshipTimeOut="20ms"
renewOnCallTime="20ms"
/>
<service>
<wellknown
mode="SingleCall"
type="Hello.HelloService,MyHello,Version=1.0.0.0,<strong name omitted>"
objectUri="HelloService.soap"
/>
<activated
type="Hello.AddService, MyHello"
/>
</service>
<channels>
<channel
port="8000"
ref="tcp"
>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
此文件指定应使用 MyHello
程序集的 1.0.0.0 版为其客户端创建对象。如果在终结点指定了同一对象的多个版本,则在激活此对象时使用指定的最后一个版本。应该牢记的是,在同一对象的不同版本之间进行的任何重大更改都可能会对客户端产生不利影响。如果在不同版本之间添加或修改了方法参数,则针对版本 1 编译的客户端在针对版本 2 使用时将引发异常。因此,建议您在版本之间有任何重大更改时将对象的新版本承载在另一个终结点上。
客户端激活的对象
当客户端激活客户端激活的(即 <activated>)对象时,网络调用被立即发送到服务器,而在该服务器,所请求的对象被激活并且对该对象的对象引用被返回到客户端。由于它控制该对象的激活,因此客户端也会选择将激活的对象的版本。例如,如果客户端是针对 HelloService 的版本 1 生成的,则将在服务器上激活此对象的版本 1,而如果客户端是针对 HelloService 的版本 2 生成的,则将在服务器上激活此对象的版本 2。
应该注意的是,在配置此服务时不能为客户端激活的类型指定版本号。此外,为服务器激活的类型提供的任何版本控制信息对客户端激活的对象没有任何影响,即使这两种类型位于同一程序集中。
例如,假设在同一程序集中存在客户端激活的类型和服务器激活的类型,并针对版本 1 生成客户端 1,针对版本 2 生成客户端 2。如果没有为服务器激活的对象指定任何版本信息,则客户端 1 将接收服务器激活的对象的版本 2 和客户端激活的对象的版本 1。客户端 2 将为已知类型和激活类型接收版本 2 对象。
如果将此服务配置为使用已知对象的程序集版本 1,则两个客户端将都接收已知对象的版本 1,同时客户端 1 接收激活类型的版本 1,而客户端 2 则接收激活类型的版本 2。
无法配置为客户端激活的版本;始终使用生成客户端时所基于的版本。
对象引用
适用于服务器激活和客户端激活的类型的相同规则也适用于对象引用。例如,当客户端激活的类型的代理作为参数从一个客户端传递到另一个客户端,或者从客户端传递到服务器时,嵌入在此对象引用中的版本信息也随之传递。当接收方试图在从对象引用中生成的代理上调用方法时,嵌入在对象引用中的版本优先于生成客户端时所基于的版本。对于服务器激活的对象,服务器指示将使用的版本,并且所有以参数形式接收对象引用的客户端将与配置该服务时指定的版本进行通信。如果没有任何版本控制,则在服务器上激活最新版本。
值封送对象
在应用程序域之间传递值封送 (MBV) 对象时,所使用的格式化程序确定是否包含版本信息。BinaryFormatter 对象始终会包含版本,而 SoapFormatter 对象将忽略版本信息。可对这两个格式化程序启用或禁用此选项。例如,如果将下面这行代码添加到配置文件,则 SoapFormatter 将在序列化对象时添加版本控制信息。
<formatter ref="soap" includeVersions="true" />