Vì bn cht phi trng thái (stateless) ca giao thc HTTP, nên mt phương thc web ch
có th góp phn làm gc ca mt phiên giao dch; nghĩa là bn không th đưa nhiu hơn
mt phương thc web vào cùng mt phiên giao dch. Mc dù thuc tính
TransactionOption chp nhn tt c các giá tr TransactionOption chun, nhưng các giá
tr này không mang ý nghĩa như mong đợi. Ví d, Disabled, NotSupported, và Supported
đều có cùng tác dng là vô hiu vic h tr giao dch. Tương t, c Required và
RequiresNew đều kích hot vic h tr giao dch và khi chy mt phiên giao dch mi.
Bn nên s dng RequiresNew trong các phương thc web vì tên ca nó tương xng vi
hành vi tht s (!).
# Các giao dch COM+ làm vic mt cách trong sut vi hu hết các ngun d
liu vì chúng cung cp các b qun lý tài nguyên tương thích. Nhưng luôn nh
rng, nếu bn tương tác vi mt tài nguyên không h tr giao dch, mã lnh s
không được roll-back. Mt s hot động không phi là giao dch: ghi file, đặt
thông tin vào trng thái phiên làm vic, và truy xut mt thiết b phn cng
(như máy in). Mt khác, các thao tác d liu vi hu hết các h cơ s d liu
Enterprise (bao gm Microsoft SQL ServerOracle) đều là tương thích COM+.
1.1 Thiết lp thông tin xác thc cho dch v Web XML
V
V
Bn mun gi các thông tin đăng nhp t client ca dch v Web XML đến IIS
authentication.
#
#
S dng thuc tính Credentials ca lp proxy. Bn có th to mt đối tượng
NetworkCredential mi cha username và password; hoc s dng
CredentialCache để ly các thông tin xác thc ca người dùng hin hành.
Cũng ging như trang web, dch v Web XML có th được s dng cùng vi IIS
authentication. Nhng gì bn cn làm là đặt dch v Web XML vào mt thư mc o hn
chế vic truy xut nc danh. Tuy nhiên, nếu người dùng có th cung cp các thông tin ánh
x đến mt tài khon người dùng hp l, người dùng này s được xác thc và bn có th
ly các thông tin xác thc này thông qua đối tượng WebService.User.
Khác vi trang web, dch v Web XML không có sn phương thc nào để thu ly thông
tin xác thc t client vì dch v Web XML được thc thi bi các ng dng khác, ch
không phi bi người dùng. Do đó, ng dng đang tương tác vi dch v Web XML s
chu trách nhim nhp bt k thông tin xác thc cn thiết nào.
Ví d sau mô phng mt dch v Web XML có thc hin xác thc người dùng.
GetIISUser tr v người dùng đã được IIS xác thc. Nếu truy xut nc danh được phép
thì kết qu s là mt chui rng. Nếu truy xut nc danh b t chi thì kết qu s là mt
chui có dng [DomainName]\[UserName] hay [ComputerName]\[UserName].
public class AuthenticationTest : System.Web.Services.WebService {
// Ly thông tin v người dùng đã được IIS xác thc.
[WebMethod()]
public string GetIISUser() {
return User.Identity.Name;
}
}
Bước cui cùng là to mt client có th cung cp các thông tin xác thc. Các thông tin
này được nhp thông qua thuc tính Credentials ca đối tượng proxy (thiết lp thuc tính
này tương t như thiết lp thuc tính WebRequest.Credentials khi ly v mt trang
web—tham kho mc 11.3). Đon mã dưới đây trình bày cách truy xut mt dch v Web
XML s dng Basic authentication (xác thc cơ bn):
// To proxy.
localhost.AuthenticationTest proxy = new localhost.AuthenticationTest();
// To thông tin xác thc.
proxy.Credentials = new System.Net.NetworkCredential(
"myUserName", "myPassword");
Console.WriteLine(proxy.GetIISUser());
Đon mã dưới đây trình bày cách truy xut mt dch v Web XML s dng Integrated
Windows authentication (xác thc được tích hp vi Windows):
// To proxy.
localhost.AuthenticationTest proxy = new localhost.AuthenticationTest();
// Gán thông tin xác thc ca người dùng hin hành cho lp proxy.
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
Console.WriteLine(proxy.GetIISUser());
1.2 Gi bt đồng b mt phương thc web
V
V
Bn cn gi mt phương thc web trong mt tiu trình khác để chương trình
ca bn có th thc hin các tác v khác trong khi ch đáp ng.
#
#
S dng các phương thc bt đồng b có sn trong lp proxy. Các phương
thc này có tên là BeginXXX và EndXXX vi XXX là tên ca phương thc đồng
b gc.
Lp proxy (đưc to t động) có các tính năng cơ bn mà bn cn để gi bt k phương
thc web nào mt cách bt đồng b. Ví d, phương thc web dưới đây có chc năng tm
dng mt khong thi gian ngu nhiên t 10 đến 19 giây:
using System;
using System.Web.Services;
public class Wait : System.Web.Services.WebService {
[WebMethod]
public int Wait() {
DateTime start = DateTime.Now;
Random rand = new Random();
TimeSpan delay = new TimeSpan(0, 0, rand.Next(10, 20));
while (DateTime.Now < start.Add(delay)) {}
return delay.Seconds;
}
}
Vi đon mã trên, lp proxy tương ng s gm ba phương thc: Wait, BeginWait và
EndWait. Phương thc Wait gi phương thc web mt cách đồng b. Phương thc
BeginWait khi chy phương thc web trong mt tiu trình riêng và tr v ngay lp tc.
Phương thc BeginXXX luôn nhn nhiu hơn phương thc gc hai đối s và tr v mt
đối tượng IAsyncState. Hai đối s này được s dng để nhp thông tin trng thái và mt
callback. Đối tượng IAsyncState cho phép bn xác định khi nào li gi kết thúc. Ví d,
bn có th định k kim tra thuc tính IAsyncState.IsComplete để xác định li gi
phương thc đã hoàn tt chưa. Khi nó đã hoàn tt, bn nhp đối tượng IAsyncState vào
phương thc EndWait để nhn giá tr tr v t phương thc web. Nếu bn gi EndWait
trước khi phương thc web hoàn tt, mã lnh ca bn s đợi cho đến khi nó hoàn tt.
Có hai mu bt đồng b ph biến dùng cho dch v Web XML. Cách th nht là gi vài
phương thc bt đồng b mt lượt, ri đợi chúng hoàn tt. Cách này cho phép bn gim
thi gian đợi tng cng, và nó làm vic tt nht vi đối tượng
System.Threading.WaitHandle. Ví d dưới đây gi phương thc Wait ba ln:
using System;
using System.Threading;
public class WaitClient {
[MTAThread]
private static void Main() {
localhost.WaitService proxy = new localhost.WaitService();
DateTime startDate = DateTime.Now;
// Gi ba phương thc mt cách bt đồng b.
IAsyncResult handle1 = proxy.BeginWait(null, null);
IAsyncResult handle2 = proxy.BeginWait(null, null);
IAsyncResult handle3 = proxy.BeginWait(null, null);
WaitHandle[] waitHandle = {handle1.AsyncWaitHandle,
handle2.AsyncWaitHandle, handle3.AsyncWaitHandle};
// Đợi cho c ba phương thc hoàn tt.
WaitHandle.WaitAll(waitHandle);
int totalDelay = proxy.EndWait(handle1) +
proxy.EndWait(handle2) + proxy.EndWait(handle3);
TimeSpan elapsedTime = DateTime.Now - startDate;
Console.WriteLine("Completed after " + elapsedTime.ToString());
Console.WriteLine("Total delay time: " + totalDelay.ToString());
}
}
Trong trường hp này, thi gian đã trôi qua nh hơn thi gian trì hoãn tng cng:
Completed after 00:00:20.2591312
Total delay time: 47
Cách th hai là s dng callback. Bn cn nhp mt y nhim ch định mt phương thc
c th trong mã lnh. Khi phương thc web hoàn tt, y nhim này s được gi vi đối s
là mt đối tượng IAsyncResult thích hp.
Dưới đây là đon mã gi phương thc BeginWait (cùng vi mt callback):
AsyncCallback callback = new AsyncCallback(Callback);
// Gi phương thc mt cách bt đồng b.
proxy.BeginWait(callback, proxy);
đây là callback (s được kích hot khi thao tác hoàn tt):
public static void Callback(IAsyncResult handle) {
localhost.WaitService proxy =
(localhost.WaitService)handle.AsyncState;
int result = proxy.EndWait(handle);
Console.WriteLine("Waited " + result.ToString());
}
1.3 To lp kh-truy-xut-t-xa
V
V
Bn mun to mt lp có th được truy xut t mt ng dng khác hay t mt
máy tính khác trên mng. Tuy vy, bn không cn tính tương thích xuyên-nn
và bn mun có hiu năng ti ưu.
#
#
Làm cho lp này tr thành kh-truy-xut-t-xa (remotable) bng cách dn
xut t lp System.MarshalByRefObject, và to mt host để đăng ký lp này
vi kiến trúc .NET Remoting.
Remoting cho phép bn làm cho mt đối tượng tr nên truy xut được qua các biên máy
và biên tiến trình. Trong khi dch v Web XML là gii pháp lý tưởng khi bn cn chia s
các chc năng qua các nn hay các biên tin cy, Remoting là la chn tt nht cho mt h
thng mà trong đó tt c các thành phn đều được xây dng trên nn .NET và h điu
hành Windows.
Để s dng .NET Remoting, bn cn các phn sau (mi phn phi thuc v mt assembly
riêng bit):
Lp kh-truy-xut-t-xaLp này có th được truy xut t các ng dng và các
máy tính khác, và phi dn xut t System.MarshalByRefObject.
ng dng hostng dng này đăng ký kiu kh-truy-xut-t-xa vi kiến trúc .NET
Remoting bng lp RemotingConfiguration (thuc không gian tên
System.Runtime.Remoting). Min là ng dng host đang chy, các client xa có
th to ra các th hin ca lp kh-truy-xut-t-xa.
ng dng clientng dng này có th to ra các th hin ca lp kh-truy-xut-t-
xa trong tiến trình ca host và tương tác vi chúng. Client s dng lp
RemotingConfiguration để đăng ký các kiu mà nó mun truy xut t xa.
Hình sau mô t s tương tác gia ba phn trên. Trong ví d này, ch có mt client. Tuy
nhiên, cũng có th có nhiu client to ra các th hin ca lp kh-truy-xut-t-xa cùng
mt lúc. Trong trường hp này, mi client s có mt đối tượng kh-truy-xut-t-xa ca
chính nó, và tt c các đối tượng này s thuc v min ng dng ca host.