Dot Net Remoting Overview
Posted On Friday, August 22, 2008 at at 3:39 PM by Unknown.NET Remoting là gì?
- Trước hết .NET Remoting là một kĩ thuật .NET được giới thiệu từ .NET framework 1.1. Cùng với .NET Webservice, .NET remoting là lựa chọn cho giải pháp xử lý tính toán từ xa. .NET Remoting là một kĩ thuật cho phép một đối tượng này truy xuất đến một đối tượng khác nằm ở các Application Domain khác nhau. Và nếu giải thích theo kiểu bình dân, ta có thể sử dụng .NET Remoting đế gọi một chương trình hoặc một service chạy trên một máy vi tính khác để xử lý một cái gì đó và trả kết quả tính toán lại cho ta.
Hình 1: .NET Remoting Overview
.NET Remoting và Distributed COM
- Vào năm một ngàn chín trăm hồi đó , người ta thường thực hiện việc giao tiếp giữa các process bằng cách sử dụng Distributed COM hay còn gọi là DCOM. DCOM đã rất hữu ích cho những chương trình chạy trên các máy tính cùng loại và nằm trong cùng một mạng. Tuy nhiên, DCOM trở nên lỗi thời vì nó không thể chạy trên Internet. DCOM dựa trên một tập giao thức mà không phải object nào cũng hỗ trợ và điều này khiến DCOM không chạy được trên những platform khác nhau. Ngoài ra, DCOM sử dụng nhiều port trong khi các port ấy thường bị chặn bởi firewall. Tất nhiên mở những port đó để nó hoạt động được không khó nhưng đó là một trong những phiền phức.
- .NET Remoting khắc phục những yếu kém của DCOM bằng cách hỗ trợ nhiều giao thức khác nhau.
.NET Remoting và Web Services
- Về khía cạnh xử lý từ xa thì Web Services hoàn toàn tương tự như .NET Remoting. Thậm chí người ta có thể làm cho .NET Remoting trở thành 1 Web Services bằng cách host nó trong IIS. Web Services cho phép các ứng dụng có thể giao tiếp với nhau mà không phụ thuộc platform, ngôn ngữ lập trình, … Tuy nhiên Web Services là một môi trường “stateless”, có nghĩa là nó không lưu lại bất kì trạng thái gì của lần gọi trước và nó cũng không biết gì về phía client đang thực hiện request. Client và server Web Services chỉ có thể trao đổi với nhau bằng các thông điệp SOAP. Những điều sau đây là các điểm khác nhau chính giữa .NET Remoting và Web Serices, chúng cũng là những nhân tố để ta chọn lựa giữa 2 công nghệ này:
• ASP.NET Web Services chỉ có thể được truy xuất qua HTTP còn .NET Remoting có thể được dùng trên nhiều giao thức khác nhau như TCP, HTTP.
• Web Services là một môi trường stateless. Khi có một request từ phía client, sẽ có một object mới được tạo ra để thực hiện request đó trên server. Còn .NET Remoting lại hỗ trợ nhiều lựa chọn state management và có thể thực hiện nhiều request từ một client, đồng thời có hỗ trợ callbacks.
• Web Services serialize các đối tượng thành XML bên trong SOAP message và vì thế có thể truyền tải thông tin của bất cứ thành phần nào miễn có thể chuyển thành XML. Còn đối với .NET Remoting thì tùy giao thức và định dạng message mà nó có thể truyền đi thông tin như thế nào. Ngoài ra theo như giới thiệu thì .NET Remoting có cho phép đối tượng được truyền vào theo cả kiểu tham chiếu(reference) và tham trị (value)
• Web services có thể hoạt động trên các platform môi trường khác nhau trong khi .NET Remoting yêu cầu phía clients phải là .NET application.
Channels
- Trong kĩ thuật .NET Remoting thì Channel được hiểu như là một kênh để giao tiếp giữa client và server. Một object từ client sẽ thông qua Channel để giao tiếp với object phía server, Channel sẽ truyền tải những message từ hai phía. Như giới thiệu phía trên thì có hai channel chính là TcpChannel và HttpChannel tương ứng với các giao thức TCP và HTTP. Ngoài ra, TcpChannel và HttpChannel đều có khả năng extend thành những Custom Channel của bạn.
Làm sao để tạo một Object có thể Remote được trong .NET Remoting?
- Một Object remote được chỉ là một object thông thường nhưng phải được inherit từ MarshalByRefObject. Đoạn code sample ở hình 2 là một ví dụ đơn giản về Remotable Object. Đối tượng SampleObject trong hình có một method đơn giản trả về phép tính tổng của hai số nguyên. Giá trị trả về của hàm là kiểu số nguyên, kiểu built-in của .NET framework. Nếu bạn muốn trả về kiểu dữ liệu bạn tự định nghĩa, hoặc một instance của class bạn định nghĩa thì lớp đó của bạn phải được khai báo với attribute Serializable.
Hình 2: Remotable Object Sample
Tạo chương trình Server để host Remotable Object
- Kế tiếp, chúng ta cần tạo ra một chương trình server để lắng nghe những request từ phía client. Trong ví dụ này chúng ta sẽ sử dụng TCP/IP channel. Đầu tiên chúng ta tạo một instance channel và đăng kí một port tương ứng cho nó. Khi có một Request từ phía client, server sẽ nhận request đó và Remote Object của chúng ta sẽ thực thi Request này. Trong .NET Remoting, có hai cơ chế để tạo instance của Remote Object rồi từ đó thực thi request: Singleton và Singlecall. Tùy vào mục đích sử dụng, nhu cầu của chương trình mà server của bạn có thể khai báo theo cơ chế WellKnownObjectMode.SingleCall, hay WellKnownObjectMode.Singleton. Khi khai báo Singleton, Remote Object sẽ được sinh ra, thực thi request, reply lại phía client và sau đó, object này vẫn được lưu lại chứ không bị hủy đi. Đến khi nào process chạy chương trình server kết thúc thì instance này mới bị trình hốt rác Garbage Collector hốt đi. Và ngược lại, khi khai báo là SingleCall, Remote Object sẽ được khởi tạo và hủy đi đối với mỗi lần nhận request từ phía client, cơ chế này tương tự như mô hình .NET Web Service truyền thống.
- Nếu bạn muốn sử dụng .NET Remoting trong IIS thì không cần tạo một chương trình server như thế này. Và tất nhiên, IIS chỉ hỗ trợ HttpChannel. Nếu host 1 .NET Remoting bên trong IIS bạn sẽ mặc nhiên sử dụng được cơ chế Authentication của IIS, ngược lại nếu làm một chương trình server để host như trên thì bạn phải cài đặt cơ chế Authentication của riêng mình. Để host một Remote Object bên trong IIS, trước tiên phải tạo 1 Virtual Directory cho application, sau đó đặt đoạn code đăng kí service bên trong event Application_Start (file global.asax)
- Trong ví dụ này, chúng ta sẽ không sử dụng IIS mà sẽ tạo một console application. Có nhiều lựa chọn khi không sử dụng IIS, ta có thể sử dụng console application, Win form application nhưng trong thực tế, người ta sẽ sử dụng một Windows Service để làm. Còn Console application hay Winform Application thường chỉ dùng để minh họa :D. Trong ví dụ này, chúng ta sẽ sử dụng port 9999 cho may mắn. Có thể một chương trình nào đó trong máy của bạn đã sử dụng port này, nếu bị như vậy bạn phải chọn port khác. Và sau cùng, để kiểm tra xem máy bạn đang lắng nghe trên những port nào (port nào đã bị sử dụng) thì ta dùng lệnh “netstat –a” trong command prompt.
- Còn bây giờ, hãy xem một console application project với 1 class tên là SampleSerrver. Trong project này tôi đã thêm reference tới System.Runtime.Remoting vào trong project để nó có thể chạy được.
Hình 3: Sample Server host Remotable Object
Tạo chương trình client để sử dụng Remote Object.
- Chương trình client trong ví dụ này cũng khá đơn giản, nó sẽ connect vào server, tạo một instance của Remote Object và excute method tính tổng.
- Các bạn lưu ý rằng trong cả chương trình client và chương trình server đều phải reference tới class SampleObject. Client sẽ gọi method của instance SampleObject, nhưng server sẽ thực thi xử lý đó chứ không phải phía client.
Hình 4: Sample Client Application
Test thử chương trình
- Trước tiên chạy chương trình server, bạn sẽ thấy message “Press the enter key to exit” trong cửa sổ console. Như vậy server của bạn đang lắng nghe trên port 9999. Bây giờ bạn hãy chạy chương trình client và sẽ nhìn thấy kết quả trả về trên màn hình. Bạn có thể chạy nhiều client để cùng request đến 1 server nhưng không thể chạy nhiều server. Bạn có thể copy chương trình server sang một máy của bạn mình và nhờ chạy thử, còn bạn sửa lại chương trình client, sửa “localhost” thành IP của máy bạn mình và chạy thử để thấy kết quả.
Tóm tắt:
- Ví dụ ở trên đã sử dụng code C# để khai báo các cấu hình cho server và client tuy nhiên .NET Remoting cho phép ta cấu hình trước trong file config (App.config). Các bạn có thể tham khảo một số resource phía dưới để biết cách làm.
- .NET Remoting là một trong những kĩ thuật tiện lợi cho những chương trình dạng Distributed Computing. Cách sử dụng nó phức tạp hơn Web Service tuy nhiên nếu bạn muốn tăng performance thì .NET Remoting với Singleton và TCP channel sẽ là lựa chọn rất tốt.
- Với sự ra đời của .NET Framework 3.x, Bác Bill và đồng bọn đã giới thiệu nền tảng mới hơn cho các kĩ thuật RPC, đó là WCF mạnh hơn .NET Remoting rất nhiều. (To be continued)
Code sample : Download
Bai viet kha hay nhung nghe chung la copy la dich lai. So sai qua. Vai cau gioi thieu Tieng Anh con sai thi dung viet bang Tieng Anh
Hi Thoại,
Mình không được như bạn có thời gian trao chuốc cho blog. Có blog của bạn đở phải vất vã cho những người đang gặp khó khăn về anh văn.
Để khi nào mình cũng cố gắng sắp sếp thời gian để trình bày về các issue gặp phải trong remoting.
Nếu bạn có time mình cũng đề nghị khi bạn giới thiệu về 1 topic nào đó nếu có 1 góc nào đó nói về các issue liên quan thì tuyệt. Đó mới là cái cần cho ai đang search thông tin.
Chúc bạn đủ sức khỏe làm IT.