1.1 Kim soát thi gian sng ca mt đối tượng xa
V
V
Bn mun cu hình thi gian sng ca mt đối tượng đơn-nht hay được-
client-kích-hot khi nó không còn được s dng.
#
#
Ch định các thiết lp mc định v thi gian sng trong file cu hình ca host;
chép đè phương thc InitializeLifetimeService trong lp xa; hoc hin thc
mt cơ chế kim soát thi gian sng bên client.
Nếu mt đối tượng s dng chế độ kích hot gi mt ln (single-call activation), nó s t
động b hy vào cui mi li gi phương thc. Điu này khác vi các đối tượng được-
client-kích-hot (client-activated) và đơn-nht (singleton), các đối tượng này có thi gian
sng lâu hơn vì tuân theo “lifetime lease” (tm dch là “hp đồng cho thuê thi gian
sng”). Vi các thiết lp mc định, mt đối tượng xa s t động b hy nếu nó không
hot động trong hai phút, min là nó đã tn ti ít nht năm phút.
Host, đối tượng xa, và client đều có th thay đổi các thiết lp v thi gian sng.
Host có th ch định các thiết lp mc định v thi gian sng trong file cu hình. Các
thiết lp này s áp dng cho tt c các đối tượng xa mà nó qun lý.
Lp xa có th chép đè phương thc GetLifetimeService để điu chnh các thiết lp
lease ban đầu bng đối tượng ILease.
Client có th gi phương thc MarshalByRefObject.GetLifetimeService vi mt đối
tượng xa c th để thu ly mt th hin ILease. Kế tiếp, client có th gi phương
thc ILease.Renew để ch định lượng thi gian ti thiu mà đối tượng s sng.
Ví d dưới đây s dng cách tiếp cn th nht (dùng th <lifetime> trong file cu hình
ca host). Các thiết lp lease áp dng cho tt c các đối tượng xa do host to ra. S
dng M để ch phút hay S để ch giây. Đối tượng xa có thi gian sng ban đầu là 10
phút. Khi client truy xut đối tượng, thi gian sng ca nó t động đưc làm mi ít nht
ba phút.
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
mode = "Singleton"
type="RemoteObjects.RemoteObject, RemoteObjects"
objectUri="RemoteObject" />
</service>
<channels>
<channel ref="tcp" port="9080" />
</channels>
<lifetime leaseTime = "10M"
renewOnCallTime = "3M" />
</application>
</system.runtime.remoting>
</configuration>
Mt cách tiếp cn khác là chép đè phương thc InitializeLifetimeService để mt đối
tượng xa t kim soát thi gian sng ca nó. Bn có th thêm đon mã dưới đây vào
lp xa để nó có thi gian sng mc định là 10 phút và thi gian làm mi là 5 phút:
public override object InitializeLifetimeService() {
ILease lease = MyBase.InitializeLifetimeService();
// Lease ch có th được cu hình nếu nó đang trng thái ban đầu.
if (lease.CurrentState == LeaseState.Initial) {
lease.InitialLeaseTime = TimeSpan.FromMinutes(10);
lease.RenewOnCallTime = TimeSpan.FromMinutes(5);
}
return lease;
}
Nếu mun đối tượng có thi gian sng vô hn, bn ch cn tr v mt tham chiếu null
thay vì là đối tượng ILease. Trường hp thông thường nht là bn mun to mt đối
tượng đơn-nht chy độc lp (và lâu dài) ngay c khi client không s dng nó.
1.2 Kim soát phiên bn ca các đối tượng xa
V
V
Bn mun to mt host có th qun lý nhiu phiên bn ca mt đối tượng.
#
#
Cài đặt tt c các phiên bn ca đối tượng vào GAC, và đăng ký mi phiên bn
ti mt endpoint URI khác bit.
.NET Remoting không có s h tr ni ti nào cho vic đánh phiên bn. Khi mt client
to mt đối tượng xa, host t động s dng phiên bn trong thư mc cc b hoc, trong
trường hp là mt assembly dùng chung, phiên bn mi nht trong GAC. Để h tr nhiu
phiên bn, bn có ba la chn:
To các ng dng host riêng bit. Mi host s có mt phiên bn khác nhau ca
assembly “đối tượng xa” và s đăng ký phiên bn ca nó vi mt URI khác nhau.
Cách này buc bn phi chy nhiu ng dng host cùng mt lúc và thiết thc nht
khi bn đang s dng IIS (được mô t trong mc 12.9).
To mt assembly “đối tượng xa” hoàn toàn mi (thay vì thay đổi phiên bn).
Theo đó, bn có th đăng ký các lp trong hai assembly ti các URI khác nhau, s
dng cùng host.
Cài đặt tt c các phiên bn ca assembly “đối tượng xa” vào GAC. Theo đó, bn
có th to mt host ánh x các URI khác nhau đến các phiên bn c th ca
assembly “đối tượng xa”.
Tùy chn cui cùng là linh hot nht trong trường hp bn cn h tr nhiu phiên bn. Ví
d, file cu hình dưới đây đăng ký hai phiên bn ca RemoteObjects ti hai endpoint khác
nhau. Bn cn ghi rõ s phiên bn và token khóa công khai khi s dng các assembly
trong GAC. Bn có th tìm thy thông tin này bng cách xem assembly trong Windows
Explorer GAC plug-in (vào thư mc C:\Windows\Assembly).
<configuration>
<system.runtime.remoting>
<application>
<service>
<!-- Thông tin type được chia thành ba hàng cho hp vi
biên trang. Trong file cu hình, thông tin này phi
được đặt trên mt hàng. -->
<wellknown mode="SingleCall"
type="RemoteObjects.RemoteObject, RemoteObjects,
Version 1.0.0.1, Culture=neutral,
PublicKeyToken=8b5ed84fd25209e1"
objectUri="RemoteObj" />
<wellknown mode="SingleCall"
type="RemoteObjects.RemoteObject, RemoteObjects,
Version 2.0.0.1, Culture=neutral,
PublicKeyToken=8b5ed84fd25209e1"
objectUri="RemoteObj_2.0" />
</service>
<channels>
<channel ref="tcp server" port="9080" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
File cu hình ca client không phi thay đổi gì hết (tr vic cp nht URI, nếu cn).
Client “chn” phiên bn mà nó mun s dng bng URI tương ng.
Hình 12.4 Thư mc C:\Windows\Assembly
1.3 To phương thc mt chiu
vi dch v Web XML hay Remoting
V
V
Bn mun mt phương thc web hay mt thành phn xa thc hin mt tác
v kéo dài, và bn không mun bt client phi đợi trong lúc mã lnh đang thc
thi.
#
#
To mt phương thc web mt chiu bng cách áp dng đặc tính
SoapDocumentMethod hay SoapRpcMethod và thiết lp thuc tính OneWay
ca đặc tính này là true. To mt phương thc Remoting mt chiu bng cách
áp dng đặc tính OneWay thuc không gian tên
System.Runtime.Remoting.Messaging.
Vi các phương thc mt chiu, client gi mt thông đip yêu cu, và server đáp ng tc
thì để cho biết rng phương thc đã bt đầu quá trình x lý. Cách làm vic này có các h
qu sau:
Client không cn đợi trong lúc mã lnh đang thc thi.
Phương thc không th tr v thông tin nào cho client (thông qua mt giá tr tr v
hay mt thông s ByRef).
Nếu phương thc ném mt ngoi l chưa-được-th-lý, nó s không đưc truyn v
cho client.
The image part with relationsh ip ID rId 5 was not fo und in the file.
Rõ ràng là các phương thc mt chiu không phù hp khi client cn nhn thông tin t
server. Tuy nhiên, chúng li lý tưởng khi cn khi chy mt kiu tác v nào đó phía
server (chng hn, bt đầu mt công vic x lý bó).
Để to mt phương thc web mt chiu, bn cn áp dng đặc tính SoapDocumentMethod
(thuc không gian tên System.Web.Services.Protocols) cho phương thc thích hp và
thiết lp thuc tính OneWay là true. Ví d dưới đây là mt dch v Web XML có hai
phương thc, mi phương thc đều gây trì hoãn 10 giây. Mt trong hai phương thc này
s dng đặc tính SoapDocumentMethod (để client không phi đợi 10 giây).
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
public class OneWayTestWebService {
[WebMethod()]
public void DoLongTaskWithWait() {
// (Bt đầu mt tác v kéo dài và khiến client phi đợi.)
Delay(10);
}
[WebMethod, SoapDocumentMethod(OneWay=true)]
public void DoLongTaskWithoutWait() {
// (Bt đầu mt tác v kéo dài nhưng không khiến client phi đợi.)
Delay(10);
}
private void Delay(int seconds) {
DateTime currentTime = DateTime.Now;
while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds)
{}
}
}
Ví d trên gi định dch v Web XML và client đang s dng SOAP document (mc
định). Nếu đang s dng Remote Procedure Call (RPC), bn hãy s dng đặc tính tương
ng là SoapRpcMethod để đánh du phương thc mt chiu.
Để to mt phương thc mt chiu trong mt thành phn trên Remoting, bn cn áp dng
đặc tính OneWay (thuc không gian tên System.Runtime.Remoting.Messaging) cho