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

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

0
91
lượt xem
41
download

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

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

Ở mức lý tưởng, đối tượng ở xa sẽ không giữ lại bất kỳ trạng thái nào. Tính chất này cho phép bạn sử dụng chế độ kích hoạt gọi một lần (single-call activation), trong đó đối tượng sẽ được tạo ra ngay đầu mỗi lời gọi phương thức và sẽ được giải phóng khi kết thúc (giống như trong dịch vụ Web XML).

Chủ đề:
Lưu

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

  1. Ở mức lý tưởng, đối tượng ở xa sẽ không giữ lại bất kỳ trạng thái nào. Tính chất này cho phép bạn sử dụng chế độ kích hoạt gọi một lần (single-call activation), trong đó đối tượng sẽ được tạo ra ngay đầu mỗi lời gọi phương thức và sẽ được giải phóng khi kết thúc (giống như trong dịch vụ Web XML). Điều này bảo đảm các đối tượng không chiếm nhiều tài nguyên của server và việc quản lý thời gian sống của chúng trở nên dễ dàng hơn. Kế đến, bạn phải tạo host—đây là ứng dụng phía server quản lý tất cả các thể hiện của lớp khả-truy-xuất-từ-xa. Bạn có thể sử dụng bất kỳ kiểu ứng dụng .NET nào làm host (bao gồm: ứng dụng dựa-trên-Windows, dịch vụ Windows, và ứng dụng Console). Dưới đây là một host đơn giản ở dạng Console: using System; using System.Runtime.Remoting; public class Server { private static void Main() { // Đăng ký các lớp khả-truy-xuất-từ-xa với .NET Remoting. RemotingConfiguration.Configure("Server.exe.config"); // Miễn là ứng dụng này đang chạy, các đối tượng ở xa // sẽ là khả truy xuất. Console.WriteLine("Press a key to shut down the server."); Console.ReadLine(); } } Chương trình trên sử dụng file cấu hình (app.config) để cấu hình các lớp mà nó sẽ hỗ trợ, các cổng mà nó sẽ hỗ trợ cho giao tiếp mạng, và địa chỉ URI (Uniform Resource Identifier) mà client sẽ sử dụng để truy xuất đối tượng. Dưới đây là một file cấu hình đơn giản đăng ký lớp RemoteObjects.RemoteObject từ RemoteObject.dll với địa chỉ cổng là 9080 thông qua giao thức TCP/IP. Assembly này phải nằm trong GAC (Global Assembly Cache) hoặc trong cùng thư mục với ứng dụng server. File cấu hình cũng cấu hình đối tượng ở xa dùng chế độ kích hoạt gọi-một-lần.
  2. Host không bao giờ tương tác trực tiếp tới các đối tượng ở xa, những gì nó làm chỉ là đăng ký các kiểu thích hợp với kiến trúc .NET Remoting. Sau thời điểm đó, ứng dụng client có thể tạo ra các đối tượng này, và ứng dụng server có thể tiếp tục thực hiện các công việc khác. Tuy nhiên, khi host bị đóng, tất cả các đối tượng sẽ bị hủy, và không thể tạo đối tượng được nữa. Ứng dụng client sử dụng file cấu hình tương tự như trên để định nghĩa địa chỉ URL và kiểu của đối tượng ở xa. Địa chỉ URL có định dạng như sau: [Protocol]://[Server]:[PortNumber]/[ObjectURI] Dưới đây là file cấu hình phía client:
  3. khác. Địa chỉ cổng 0 nghĩa là "lấy bất kỳ một địa chỉ cổng nào còn trống". --> Ứng dụng client sử dụng phương thức RemotingConfiguration.Configure để đăng ký các đối tượng mà nó muốn gọi. Sau khi đã đăng ký xong, client có thể tạo đối tượng này giống như tạo đối tượng cục bộ mặc dù nó thật sự nằm trong miền ứng dụng của host. Đoạn mã dưới đây trình bày các bước này: using System; using System.Runtime.Remoting; using System.Data; using RemoteObject; public class Client { private static void Main() { // Đăng ký các lớp sẽ được truy xuất từ xa. RemotingConfiguration.Configure("Client.exe.config"); // Tương tác với đối tượng ở xa thông qua proxy. ProductsDB proxy = new ProductsDB(); // Hiển thị tên miền ứng dụng của host. Console.WriteLine("Object executing in: " + proxy.GetHostLocation()); // Lấy DataSet và hiển thị nội dung của nó. DataTable dt = proxy.GetProducts(); foreach (DataRow row in dt.Rows) { Console.WriteLine(row[1]); }
  4. Console.ReadLine(); } } Để tạo một đối tượng ở xa, client cần một tham chiếu đến assembly mà lớp này được định nghĩa trong đó. Điều này cần thêm một bước triển khai nữa, bạn có thể tránh đi bằng cách sử dụng một giao diện có định nghĩa các chức năng được hỗ trợ. Để chuyển dữ liệu đến đối tượng ở xa (hoặc chuyển dữ liệu từ đối tượng ở xa về), các kiểu dữ liệu dùng cho các tham số và giá trị trả về phải là khả-tuần-tự- hóa (serializable—tất cả các kiểu cơ bản đều có tính chất này). Nếu muốn sử dụng các lớp tùy biến để chuyển dữ liệu, bạn phải làm cho các lớp này trở thành khả-tuần-tự-hóa bằng cách áp dụng đặc tính Serializable (xem mục 16.1 để biết thêm chi tiết). 1.1 Đăng ký tất cả các lớp khả-truy-xuất-từ-xa trong một assembly Bạn muốn đăng ký tất cả các lớp khả-truy-xuất-từ-xa được định nghĩa trong một assembly mà không phải chỉ định chúng trong file cấu hình. Nạp assembly (có chứa các lớp khả-truy-xuất-từ-xa) bằng cơ chế phản chiếu (reflection). Duyệt qua tất cả các kiểu trong đó và sử dụng phương thức RemotingConfiguration.RegisterWellKnownServiceType để đăng ký mỗi lớp khả-truy-xuất-từ-xa. .NET cho phép bạn đăng ký các lớp khả-truy-xuất-từ-xa một cách dễ dàng thông qua việc viết file cấu hình hoặc viết mã chương trình. Xét ví dụ trong mục 12.7. Để đăng ký bằng mã chương trình, trước hết bạn phải gỡ bỏ những khai báo lớp trong file cấu hình trên server như sau: Bây giờ, bạn có thể sử dụng kỹ thuật phản chiếu kết hợp với phương thức RegisterWellKnownServiceType để đăng ký tất cả các lớp khả-truy-xuất-từ-xa. Tuy
  5. nhiên, bạn cần thêm một tham chiếu đến System.Runtime.Remoting.dll. Đoạn mã dưới đây tìm các lớp khả-truy-xuất-từ-xa trong RemoteObject.dll và đăng ký mỗi lớp: using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Reflection; public class Server { private static void Main() { // Sử dụng file cấu hình để định nghĩa các tùy chọn về mạng. RemotingConfiguration.Configure("Server.exe.config"); // Lấy kênh Remoting đã được đăng ký. TcpChannel channel = (TcpChannel)ChannelServices.RegisteredChannels[0]; // Nạp RemoteObject.dll. Assembly assembly = Assembly.LoadFrom("RemoteObject.dll"); // Xử lý tất cả các kiểu trong RemoteObject.dll. foreach (Type type in assembly.GetTypes()) { // Kiểm tra kiểu có phải là khả-truy-xuất-từ-xa hay không. if (type.IsSubclassOf(typeof(MarshalByRefObject))) { // Đăng ký kiểu (tên kiểu là địa chỉ URI). Console.WriteLine("Registering " + type.Name); RemotingConfiguration.RegisterWellKnownServiceType( type, type.Name, WellKnownObjectMode.SingleCall); // Xác định địa chỉ URL (kiểu được publish tại đây). string[] urls = channel.GetUrlsForUri(type.Name); Console.WriteLine(urls[0]); } }
  6. Console.WriteLine("Press a key to shut down the server."); Console.ReadLine(); } }

CÓ THỂ BẠN MUỐN DOWNLOAD

Đồng bộ tài khoản