遠端處理中的版本資訊
遠端處理是設計為使用強式名稱的組件。將強式名稱搭配遠端處理使用時,適用於下列基本規則:
IMethodCallMessage 介面實作的 TypeName 屬性一律會包含版本。
IMethodCallMessage 介面實作的 TypeName 屬性一律會包含版本。
遠端處理中的所有其他版本控制都是由使用中之格式子的 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>
這個檔案指定應使用 1.0.0.0 版的 MyHello
組件來建立其用戶端的物件。端點上指定多個版本的相同物件時,則在啟動物件時會使用所指定的最後一個版本。請務必記住,相同物件不同版本間的任何重大變更都會對用戶端產生不良的影響。如果在不同版本間加入或修改方法參數,則在搭配使用第 2 版時,使用第 1 版編譯的用戶端會擲回例外狀況。因此,版本間發生任何重大變更時,建議將新版的物件裝載在不同的端點上。
用戶端啟動的物件
用戶端啟動用戶端啟動的 (即 <activated>) 物件時,會立即將網路呼叫傳送給伺服器,而這個伺服器會啟動所要求的物件,並將物件的物件參考傳回給用戶端。因為是由用戶端引導物件的啟動,所以也是由用戶端選擇要啟動的物件版本。例如,如果用戶端是用第 1 版的 HelloService 建置而成,則會在伺服器上啟動 1 版的物件;如果用戶端是用第 2 版的 HelloService 建置而成,則會在伺服器上啟動第 2 版。
請務必注意,設定服務時,不可指定用戶端啟動型別的版本編號。此外,即使伺服器啟動型別和用戶端啟動的物件都位在同一組件中,任何針對伺服器啟動的型別所提供的版本控制資訊,對於用戶端啟動的物件不會有任何影響。
例如,假設同一組件中有用戶端啟動的型別和伺服器啟動的型別,而您使用第 1 版建置 client1,並使用第 2 版建置 client2。如果未指定伺服器啟動物件的版本資訊,則 client1 會接收第 2 版的伺服器啟動物件和第 1 版的用戶端啟動物件。Client2 會接收已知和啟動型別的第 2 版物件。
如果將服務設定為使用已知物件的第 1 版組件,則 client 1 會接收第 1 版的啟動型別,client 2 會接收第 2 版的啟動型別,而這兩個用戶端都會接收第 1 版的已知物件。
無法設定要針對用戶端啟動的版本;一律會使用建置用戶端時所用的版本。
物件參考
適用於伺服器啟動和用戶端啟動型別的相同規則,也適用於物件參考。例如,將用戶端啟動型別的 Proxy 當做參數從某個用戶端傳遞到另一個用戶端 (或從用戶端傳遞到伺服器) 時,內嵌在物件參考中的版本資訊也會跟著一起傳遞。接收者嘗試在從物件參考產生的 Proxy 上呼叫方法時,內嵌在物件參考中之版本的優先順序高於用來建置用戶端的版本。在伺服器啟動物件的情況下,伺服器會指定所要使用的版本,而將物件參考當做參數接收的所有用戶端,則會與設定服務時所指定的版本進行通訊。在沒有版本控制的情況下,則會啟動伺服器上的最新版本。
Marshal-By-Value 物件
在應用程式定義域間傳遞 marshal-by-value (MBV) 物件時,所使用的格式子會決定是否包含版本資訊。BinaryFormatter 物件一律會包含版本,而 SoapFormatter 物件則會忽略版本資訊。您可針對這兩個格式子,啟動或停用這個選項。例如,如果將下面一行程式碼加入至組態檔中,則 SoapFormatter 會在序列化物件時加入版本控制資訊。
<formatter ref="soap" includeVersions="true" />