1.1 Qun lý các đối tượng xa trong IIS
V
V
Bn mun to mt đối tượng kh-truy-xut-t-xa trong IIS (để có th s dng
SSL hay IIS authentication) thay cho mt host chuyên bit.
#
#
Đặt file cu hình và assembly vào mt thư mc o, và thay đổi URI sao cho nó
kết thúc bng .rem hay .soap.
Thay vì to mt host chuyên bit, bn có th qun lý mt lp kh-truy-xut-t-xa trong
IIS (Internet Information Services). Điu này cho phép bn bo đảm các lp kh-truy-
xut-t-xa s luôn có hiu lc, và cho phép bn s dng các tính năng ca IIS như SSL
EncryptionIntegrated Windows authentication.
Để qun lý mt lp kh-truy-xut-t-xa trong IIS, trước hết bn phi to mt thư mc o.
Thư mc này cha hai th: file cu hình dùng để đăng ký các lp kh-truy-xut-t-xa và
thư mc bin dùng để cha Class Library Assembly tương ng (hoc cài đặt assembly vào
GAC).
File cu hình này hoàn toàn tương t vi file cu hình mà bn s dng cho mt host tùy
biến. Tuy nhiên, bn phi tuân theo các quy tc:
Bn phi s dng kênh HTTP (mc dù có th s dng Binary formatter đối vi các
kích thước thông đip nh hơn).
Bn không th ch c th địa ch cng. IIS lng nghe tt c các cng bn đã cu hình
trong IIS Manager (cng 80443).
URI phi kết thúc bng .rem hay .soap.
File cu hình phi có tên là Web.config, nếu không nó s b b qua.
File Web.config dưới đây s đăng ký lp đã được trình bày trong mc 12.7:
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall"
type="RemoteObject.ProductsDB, RemoteObject"
objectUri="RemoteObject.rem" />
</service>
<channels>
<channel ref="http">
<!-- G b chú thích dưới đây để s dng Binary formatter
thay cho SOAP formatter (mc định). -->
<!--
<serverProviders>
<formatter ref="binary"/>
</serverProviders>
-->
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
Client có th s dng đối tượng được qun lý trong IIS ging như đối tượng được qun lý
trong mt host tùy biến. Tuy nhiên, tên thư mc o s là mt phn ca URI. Ví d, nếu
file Web.config va trình bày trên được đặt trong thư mc o
http://localhost/RemoteObjects thì URL đầy đủ s
http://localhost/RemoteObjects/RemoteObject.rem.
# Khi qun lý mt đối tượng vi IIS, tài khon được s dng để thc thi đối
tượng là tài khon ASP.NET (được định nghĩa trong file machine.config). Nếu
tài khon này không có quyn truy xut cơ s d liu (là trng thái mc định),
bn s gp li khi chy ví d này. Để gii quyết vn đề này, bn hãy xem mc
7.17.
1.2 Phát sinh s kin trên kênh truy xut t xa
V
V
Bn cn to mt client có th nhn mt s kin do đối tượng xa phát sinh.
#
#
Phi chc rng bn đang s dng các kênh hai chiu (bidirectional channel).
To mt đối tượng kh-truy-xut-t-xa bên client (có th nhn s kin t
server).
Mc dù cú pháp th lý s kin không h thay đổi khi bn s dng .NET Remoting, nhưng
bn cn to mt client có th th lý s kin t mt đối tượng xa. Dưới đây là các yêu
cu chính:
Lp kh-truy-xut-t-xa phi s dng chế độ được-client-kích-hot (client-
activated) hay chế độ kích hot đơn-nht (singleton activation)không phi chế độ
kích hot gi-mt-ln (single-call activation). Điu này bo đảm đối tượng vn “còn
sng” gia các ln gi phương thc, cho phép nó phát sinh s kin đến client.
Client phi s dng kênh hai chiu để nó có th nhn các kết ni do server khi to.
Đối tượng EventArgs phi là kh-tun-t-hóa để nó có th được chuyn qua các
biên min ng dng.
Client phi s dng mt đối tượng kh-truy-xut-t-xa để nhn s kin (được gi là
listener). Theo đó, listener s dng mt s kin cc b mà client có th xđược.
Đối tượng xa không th trc tiếp phát sinh s kin đến mt lp bình thường vì lp
bình thường không th được truy xut t các min ng dng khác.
Bn phi thay đổi các file cu hình ca client và server để cho phép “full
serialization” (điu này không cn thiết vi .NET 1.0).
Dưới đây là lp kh-truy-xut-t-xa mà bn có th s dng để phát sinh mt s kin đến
client. Lp này cung cp phương thc StartTask để khi chy mt b định thi, phát sinh
sau mt thi gian ngn (khong 10 giây). Khi b định thi phát sinh, đối tượng kh-truy-
xut-t-xa dng lên s kin TaskComplete.
using System;
using System.Timers;
public delegate void TaskCompleted(object sender,
TaskCompleteEventArgs e);
public class RemoteObject : MarshalByRefObject {
public event TaskCompleted TaskComplete;
private Timer tmr = new Timer();
public void StartTask() {
tmr.Interval = 10000;
tmr.Elapsed += new ElapsedEventHandler(tmrCallback);
tmr.Start();
}
private void tmrCallback(object sender, ElapsedEventArgs e) {
tmr.Enabled = false;
if (TaskComplete != null) {
TaskComplete(this,
new TaskCompleteEventArgs("Task completed on server"));
}
}
public override object InitializeLifetimeService() {
return null;
}
}
[Serializable()]
public class TaskCompleteEventArgs : EventArgs {
public string Result;
public TaskCompleteEventArgs(string result) {
this.Result = result;
}
}
Bước kế tiếp là định nghĩa mt lp kh-truy-xut-t-xa chy trên client và có th nhn s
kin này. Theo đó, lp này có th tiếp xúc vi client. Lp EventListener dưới đây trình
bày mt ví d như thế—nó ch đơn gin dng lên s kin th hai, mà client có th trc
tiếp x lý. Cũng như tt c các đối tượng kh-truy-xut-t-xa, nó s ch được truy xut
trong 5 phút, tr khi bn thay đổi chính sách “lease” (s đưc mô t trong mc 12.11). Có
mt cách là chép đè phương thc InitializeLifetimeService để cho phép đối tượng được
sng vĩnh vin:
public class EventListener : MarshalByRefObject {
public event RemoteObject.TaskCompleted TaskComplete;
// Th lý s kin xa.
public void OnTaskComplete(object sender,
RemoteObject.TaskCompleteEventArgs e) {
TaskComplete(sender, e);
}
public override object InitializeLifetimeService() {
return null;
}
}
Listener phi được định nghĩa trong mt assembly riêng để nó có th được tham chiếu
bi ng dng client và lp kh-truy-xut-t-xa (c hai đều cn tương tác vi nó).
Bây gi ng dng client có th khi chy tác v bt đồng b thông qua lp RemoteObject
và th lý s kin thông qua lp EventListener. Đon mã dưới đây trình bày mt client ch
đơn gin hin th thông báo khi nhn được s kin:
using System;
using System.Windows.Forms;
using System.Runtime.Remoting;
public class ClientForm : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdStart;
// (B qua phn mã designer.)
RemoteObject.RemoteObject remoteObj;
EventListener.EventListener listener;
private void ClientForm_Load(object sender, System.EventArgs e) {
RemotingConfiguration.Configure("Client.exe.config");
remoteObj = new RemoteObject.RemoteObject();
listener = new EventListener.EventListener();
}
private void cmdStart_Click(object sender, System.EventArgs e) {
// Kết ni phương thc th lý s kin xa.
remoteObj.TaskComplete += new
RemoteObject.TaskCompleted(listener.OnTaskComplete);
// Kết ni phương thc th lý s kin cc b.
listener.TaskComplete +=
new RemoteObject.TaskCompleted(TaskComplete);
remoteObj.StartTask();
MessageBox.Show("Task has been started.");
}
// Định nghĩa phương thc th lý s kin cc b.
private void TaskComplete(object sender,