Dịch vụ Web XML và Remoting Microsoft .NET Framework phần 2

Chia sẻ: Nghia Bui Tuan | Ngày: | Loại File: PDF | Số trang:7

0
85
lượt xem
44
download

Dịch vụ Web XML và Remoting Microsoft .NET Framework phần 2

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Vì bản chất phi trạng thái (stateless) của giao thức HTTP, nên một phương thức web chỉ có thể góp phần làm gốc của một phiên giao dịch; nghĩa là bạn không thể đưa nhiều hơn một phương thức web vào cùng một phiên giao dịch.

Chủ đề:
Lưu

Nội dung Text: Dịch vụ Web XML và Remoting Microsoft .NET Framework phần 2

  1. Vì bản chất phi trạng thái (stateless) của giao thức HTTP, nên một phương thức web chỉ có thể góp phần làm gốc của một phiên giao dịch; nghĩa là bạn không thể đưa nhiều hơn một phương thức web vào cùng một phiên giao dịch. Mặc dù thuộc tính TransactionOption chấp nhận tất cả các giá trị TransactionOption chuẩn, 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 dụng là vô hiệu việc hỗ trợ giao dịch. Tương tự, cả Required và RequiresNew đều kích hoạt việc hỗ trợ giao dịch và khởi chạy một phiên giao dịch mới. Bạn nên sử dụng RequiresNew trong các phương thức web vì tên của nó tương xứng với hành vi thật sự (!). Các giao dịch COM+ làm việc một cách trong suốt với hầu hết các nguồn dữ liệu vì chúng cung cấp các bộ quản lý tài nguyên tương thích. Nhưng luôn nhớ rằng, nếu bạn tương tác với một tài nguyên không hỗ trợ giao dịch, mã lệnh sẽ không được roll-back. Một số hoạt động không phải là giao dịch: ghi file, đặt thông tin vào trạng thái phiên làm việc, và truy xuất một thiết bị phần cứng (như máy in). Mặt khác, các thao tác dữ liệu với hầu hết các hệ cơ sở dữ liệu Enterprise (bao gồm Microsoft SQL Server và Oracle) đều là tương thích COM+. 1.1 Thiết lập thông tin xác thực cho dịch vụ Web XML Bạn muốn gửi các thông tin đăng nhập từ client của dịch vụ Web XML đến IIS authentication. Sử dụng thuộc tính Credentials của lớp proxy. Bạn có thể tạo một đối tượng NetworkCredential mới chứa username và password; hoặc sử dụng CredentialCache để lấy các thông tin xác thực của người dùng hiện hành. Cũng giống như trang web, dịch vụ Web XML có thể được sử dụng cùng với IIS authentication. Những gì bạn cần làm là đặt dịch vụ Web XML vào một thư mục ảo hạn chế việc truy xuất nặc danh. Tuy nhiên, nếu người dùng có thể cung cấp các thông tin ánh xạ đến một tài khoản người dùng hợp lệ, người dùng này sẽ được xác thực và bạn có thể lấy các thông tin xác thực này thông qua đối tượng WebService.User. Khác với trang web, dịch vụ Web XML không có sẵn phương thức nào để thu lấy thông tin xác thực từ client vì dịch vụ Web XML được thực thi bởi các ứng dụng khác, chứ không phải bởi người dùng. Do đó, ứng dụng đang tương tác với dịch vụ Web XML sẽ chịu trách nhiệm nhập bất kỳ thông tin xác thực cần thiết nào. Ví dụ sau mô phỏng một dịch vụ Web XML có thực hiện xác thực người dùng. GetIISUser trả về người dùng đã được IIS xác thực. Nếu truy xuất nặc danh được phép thì kết quả sẽ là một chuỗi rỗng. Nếu truy xuất nặc danh bị từ chối thì kết quả sẽ là một chuỗi có dạng [DomainName]\[UserName] hay [ComputerName]\[UserName]. public class AuthenticationTest : System.Web.Services.WebService {
  2. // Lấy thông tin về người dùng đã được IIS xác thực. [WebMethod()] public string GetIISUser() { return User.Identity.Name; } } Bước cuối cùng là tạo một client có thể cung cấp các thông tin xác thực. Các thông tin này được nhập thông qua thuộc tính Credentials của đối tượng proxy (thiết lập thuộc tính này tương tự như thiết lập thuộc tính WebRequest.Credentials khi lấy về một trang web—tham khảo mục 11.3). Đoạn mã dưới đây trình bày cách truy xuất một dịch vụ Web XML sử dụng Basic authentication (xác thực cơ bản): // Tạo proxy. localhost.AuthenticationTest proxy = new localhost.AuthenticationTest(); // Tạo thông tin xác thực. proxy.Credentials = new System.Net.NetworkCredential( "myUserName", "myPassword"); Console.WriteLine(proxy.GetIISUser()); Đoạn mã dưới đây trình bày cách truy xuất một dịch vụ Web XML sử dụng Integrated Windows authentication (xác thực được tích hợp với Windows): // Tạo proxy. localhost.AuthenticationTest proxy = new localhost.AuthenticationTest(); // Gán thông tin xác thực của người dùng hiện hành cho lớp proxy. proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; Console.WriteLine(proxy.GetIISUser()); 1.2 Gọi bất đồng bộ một phương thức web Bạn cần gọi một phương thức web trong một tiểu trình khác để chương trình của bạn có thể thực hiện các tác vụ khác trong khi chờ đáp ứng. Sử dụng các phương thức bất đồng bộ có sẵn trong lớp proxy. Các phương thức này có tên là BeginXXX và EndXXX với XXX là tên của phương thức đồng bộ gốc.
  3. Lớp proxy (được tạo tự động) có các tính năng cơ bản mà bạn cần để gọi bất kỳ phương thức web nào một cách bất đồng bộ. Ví dụ, phương thức web dưới đây có chức năng tạm dừng một khoảng thời gian ngẫu 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; } } Với đoạn mã trên, lớp proxy tương ứng sẽ gồm ba phương thức: Wait, BeginWait và EndWait. Phương thức Wait gọi phương thức web một cách đồng bộ. Phương thức BeginWait khởi chạy phương thức web trong một tiểu trình riêng và trả về ngay lập tức. Phương thức BeginXXX luôn nhận nhiều hơn phương thức gốc hai đối số và trả về một đối tượng IAsyncState. Hai đối số này được sử dụng để nhập thông tin trạng thái và một callback. Đối tượng IAsyncState cho phép bạn xác định khi nào lời gọi kết thúc. Ví dụ, bạn có thể định kỳ kiểm tra thuộc tính IAsyncState.IsComplete để xác định lời gọi phương thức đã hoàn tất chưa. Khi nó đã hoàn tất, bạn nhập đối tượng IAsyncState vào phương thức EndWait để nhận giá trị trả về từ phương thức web. Nếu bạn gọi EndWait trước khi phương thức web hoàn tất, mã lệnh của bạn sẽ đợi cho đến khi nó hoàn tất. Có hai mẫu bất đồng bộ phổ biến dùng cho dịch vụ Web XML. Cách thứ nhất là gọi vài phương thức bất đồng bộ một lượt, rồi đợi chúng hoàn tất. Cách này cho phép bạn giảm thời gian đợi tổng cộng, và nó làm việc tốt nhất với đối tượng System.Threading.WaitHandle. Ví dụ dưới đây gọi phương thức Wait ba lần: using System; using System.Threading; public class WaitClient { [MTAThread]
  4. private static void Main() { localhost.WaitService proxy = new localhost.WaitService(); DateTime startDate = DateTime.Now; // Gọi ba phương thức một cách bất đồ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 thức hoàn tất. 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 hợp này, thời gian đã trôi qua nhỏ hơn thời gian trì hoãn tổng cộng: Completed after 00:00:20.2591312 Total delay time: 47 Cách thứ hai là sử dụng callback. Bạn cần nhập một ủy nhiệm chỉ định một phương thức cụ thể trong mã lệnh. Khi phương thức web hoàn tất, ủy nhiệm này sẽ được gọi với đối số là một đối tượng IAsyncResult thích hợp. Dưới đây là đoạn mã gọi phương thức BeginWait (cùng với một callback): AsyncCallback callback = new AsyncCallback(Callback); // Gọi phương thức một cách bất đồng bộ. proxy.BeginWait(callback, proxy); Và đây là callback (sẽ được kích hoạt khi thao tác hoàn tất): public static void Callback(IAsyncResult handle) {
  5. localhost.WaitService proxy = (localhost.WaitService)handle.AsyncState; int result = proxy.EndWait(handle); Console.WriteLine("Waited " + result.ToString()); } 1.3 Tạo lớp khả-truy-xuất-từ-xa Bạn muốn tạo một lớp có thể được truy xuất từ một ứng dụng khác hay từ một máy tính khác trên mạng. Tuy vậy, bạn không cần tính tương thích xuyên-nền và bạn muốn có hiệu năng tối ưu. Làm cho lớp này trở thành khả-truy-xuất-từ-xa (remotable) bằng cách dẫn xuất từ lớp System.MarshalByRefObject, và tạo một host để đăng ký lớp này với kiến trúc .NET Remoting. Remoting cho phép bạn làm cho một đối tượng trở nên truy xuất được qua các biên máy và biên tiến trình. Trong khi dịch vụ Web XML là giải pháp lý tưởng khi bạn cần chia sẻ các chức năng qua các nền hay các biên tin cậy, Remoting là lựa chọn tốt nhất cho một hệ thống mà trong đó tất cả các thành phần đều được xây dựng trên nền .NET và hệ điều hành Windows. Để sử dụng .NET Remoting, bạn cần các phần sau (mỗi phần phải thuộc về một assembly riêng biệt): • Lớp khả-truy-xuất-từ-xa⎯Lớp này có thể được truy xuất từ các ứng dụng và các máy tính khác, và phải dẫn xuất từ System.MarshalByRefObject. • Ứng dụng host⎯Ứng dụng này đăng ký kiểu khả-truy-xuất-từ-xa với kiến trúc .NET Remoting bằng lớp RemotingConfiguration (thuộc không gian tên System.Runtime.Remoting). Miễn là ứng dụng host đang chạy, các client ở xa có thể tạo ra các thể hiện của lớp khả-truy-xuất-từ-xa. • Ứng dụng client⎯Ứng dụng này có thể tạo ra các thể hiện của lớp khả-truy-xuất-từ- xa trong tiến trình của host và tương tác với chúng. Client sử dụng lớp RemotingConfiguration để đăng ký các kiểu mà nó muốn truy xuất từ xa. Hình sau mô tả sự tương tác giữa ba phần trên. Trong ví dụ này, chỉ có một client. Tuy nhiên, cũng có thể có nhiều client tạo ra các thể hiện của lớp khả-truy-xuất-từ-xa cùng một lúc. Trong trường hợp này, mỗi client sẽ có một đối tượng khả-truy-xuất-từ-xa của chính nó, và tất cả các đối tượng này sẽ thuộc về miền ứng dụng của host.
  6.   Ordinary Object Remotable Object   Cross-application call   Client Component host Hình 12.3 Sử dụng một lớp khả-truy-xuất-từ-xa Bước đầu tiên là tạo lớp khả-truy-xuất-từ-xa. Ví dụ, lớp khả-truy-xuất-từ-xa dưới đây trả về một DataSet; với cách này, một client có thể truy xuất thông tin từ cơ sở dữ liệu mà không phải trực tiếp kết nối đến cơ sở dữ liệu phía server. using System; using System.Data; using System.Data.SqlClient; public class ProductsDB : MarshalByRefObject { private static string connectionString = "Data Source=localhost;" + "Initial Catalog=Northwind;Integrated Security=SSPI"; public DataTable GetProducts() { string SQL = "SELECT * FROM Products"; // Tạo các đối tượng ADO.NET. SqlConnection con = new SqlConnection(connectionString); SqlCommand com = new SqlCommand(SQL, con); SqlDataAdapter adapter = new SqlDataAdapter(com); DataSet ds = new DataSet(); // Thực thi câu truy vấn. try { con.Open(); adapter.Fill(ds, "Products"); } catch (Exception err) { Console.WriteLine(err.ToString()); } finally { con.Close(); }
  7. return ds.Tables[0]; } // Phương thức này kiểm tra Remoting có hoạt động hay không. public string GetHostLocation() { return AppDomain.CurrentDomain.FriendlyName; } } Lớp này được định nghĩa trong một Class Library Assembly có tên là RemoteObject.dll.

CÓ THỂ BẠN MUỐN DOWNLOAD

Đồng bộ tài khoản