1. Trang chủ
  2. » Công Nghệ Thông Tin

Các giải pháp lập trình CSharp- P62 pps

10 222 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 2,63 MB

Nội dung

501 Chương 12: Dịch vụ Web XML và Remoting private void TaskComplete(object sender, RemoteObject.TaskCompleteEventArgs e) { MessageBox.Show("Event received: " + e.Result); } } Để có thể làm việc, bạn phải chắc rằng client đang sử dụng các kênh hai chiều. Do đó, thẻ <channel> trong file cấu hình phải trông giống như sau: <channel ref="tcp" port="0" /> Và không được giống như các ví dụ dưới đây: <channel ref="tcp server" port="0" /> <channel ref="tcp client" port="0" /> Ngoài ra, bạn phải kích hoạt việc hỗ trợ “full serialization”. Nếu không, server sẽ không được phép nhận ủy nhiệm cho phương thức Listener.TaskCompleted , và sẽ không thể kết nối đến phương thức thụ lý sự kiện ở xa. Để kích hoạt việc hỗ trợ “full serialization” bên server, bạn cần thay đổi file cấu hình của host như sau: <configuration> <system.runtime.remoting> <application> <client url="tcp://localhost:9080/Server"> <activated type="RemoteObject.RemoteObject, RemoteObject"/> </client> <channels> <channel ref="tcp" port="0"> <serverProviders> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration> Để kích hoạt việc hỗ trợ “full serialization” bên client, bạn cần thay đổi file cấu hình của client như sau: <configuration> 502 Chương 12: Dịch vụ Web XML và Remoting <system.runtime.remoting> <application name="SimpleServer" > <service> <activated type="RemoteObject.RemoteObject, RemoteObject"/> </service> <channels> <channel ref="tcp" port="9080"> <serverProviders> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration> 11. 11. Ki m soát th i gian s ng c a m t đ i t ng xa ể ờ ố ủ ộ ố ượ ở Ki m soát th i gian s ng c a m t đ i t ng xa ể ờ ố ủ ộ ố ượ ở   Bạn muốn cấu hình thời gian sống của một đối tượng đơn-nhất hay được-client- kích-hoạt khi nó không còn được sử dụng.   Chỉ định các thiết lập mặc định về thời gian sống trong file cấu hình của host; chép đè phương thức InitializeLifetimeService trong lớp ở xa; hoặc hiện thực một cơ chế kiểm soát thời gian sống bên client. Nếu một đối tượng sử dụng chế độ kích hoạt gọi một lần (single-call activation), nó sẽ tự động bị hủy vào cuối mỗi lời gọi phương thức. Điều này khác với các đối tượng được-client- kích-hoạt (client-activated) và đơn-nhất (singleton), các đối tượng này có thời gian sống lâu hơn vì tuân theo “lifetime lease” (tạm dịch là “hợp đồng cho thuê thời gian sống”). Với các thiết lập mặc định, một đối tượng ở xa sẽ tự động bị hủy nếu nó không hoạt động trong hai phút, miễn là nó đã tồn tại ít nhất năm phút. Host, đối tượng ở xa, và client đều có thể thay đổi các thiết lập về thời gian sống. • Host có thể chỉ định các thiết lập mặc định về thời gian sống trong file cấu hình. Các thiết lập này sẽ áp dụng cho tất cả các đối tượng ở xa mà nó quản lý. • Lớp ở xa có thể chép đè phương thức GetLifetimeService để điều chỉnh các thiết lập lease ban đầu bằng đối tượng ILease . 503 Chương 12: Dịch vụ Web XML và Remoting • Client có thể gọi phương thức MarshalByRefObject.GetLifetimeService với một đối tượng ở xa cụ thể để thu lấy một thể hiện ILease . Kế tiếp, client có thể gọi phương thức ILease.Renew để chỉ định lượng thời gian tối thiểu mà đối tượng sẽ sống. Ví dụ dưới đây sử dụng cách tiếp cận thứ nhất (dùng thẻ <lifetime> trong file cấu hình của host). Các thiết lập lease áp dụng cho tất cả các đối tượng ở xa do host tạo ra. Sử dụng M để chỉ phút hay S để chỉ giây. Đối tượng ở xa có thời gian sống ban đầu là 10 phút. Khi client truy xuất đối tượng, thời gian sống của nó tự động được làm mới ít nhất ba phút. <configuration> <system.runtime.remoting> <application> <service> <wellknown mode = "Singleton" type="RemoteObjects.RemoteObject, RemoteObjects" objectUri="RemoteObject" /> </service> <channels> <channel ref="tcp" port="9080" /> </channels> <lifetime leaseTime = "10M" renewOnCallTime = "3M" /> </application> </system.runtime.remoting> </configuration> Một cách tiếp cận khác là chép đè phương thức InitializeLifetimeService để một đối tượng ở xa tự kiểm soát thời gian sống của nó. Bạn có thể thêm đoạn mã dưới đây vào lớp ở xa để nó có thời gian sống mặc định là 10 phút và thời gian làm mới là 5 phút: public override object InitializeLifetimeService() { ILease lease = MyBase.InitializeLifetimeService(); // Lease chỉ có thể được cấu hình nếu nó đang ở trạng thái ban đầu. if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromMinutes(10); lease.RenewOnCallTime = TimeSpan.FromMinutes(5); } 504 Chương 12: Dịch vụ Web XML và Remoting return lease; } Nếu muốn đối tượng có thời gian sống vô hạn, bạn chỉ cần trả về một tham chiếu null thay vì là đối tượng ILease . Trường hợp thông thường nhất là bạn muốn tạo một đối tượng đơn-nhất chạy độc lập (và lâu dài) ngay cả khi client không sử dụng nó. 12. 12. Ki m soát phiên b n c a các đ i t ng xaể ả ủ ố ượ ở Ki m soát phiên b n c a các đ i t ng xaể ả ủ ố ượ ở   Bạn muốn tạo một host có thể quản lý nhiều phiên bản của một đối tượng.   Cài đặt tất cả các phiên bản của đối tượng vào GAC , và đăng ký mỗi phiên bản tại một endpoint URI khác biệt. .NET Remoting không có sự hỗ trợ nội tại nào cho việc đánh phiên bản. Khi một client tạo một đối tượng ở xa, host tự động sử dụng phiên bản trong thư mục cục bộ hoặc, trong trường hợp là một assembly dùng chung, phiên bản mới nhất trong GAC. Để hỗ trợ nhiều phiên bản, bạn có ba lựa chọn: • Tạo các ứng dụng host riêng biệt. Mỗi host sẽ có một phiên bản khác nhau của assembly “đối tượng ở xa” và sẽ đăng ký phiên bản của nó với một URI khác nhau. Cách này buộc bạn phải chạy nhiều ứng dụng host cùng một lúc và thiết thực nhất khi bạn đang sử dụng IIS (được mô tả trong mục 12.9). • Tạo một assembly “đối tượng ở xa” hoàn toàn mới (thay vì thay đổi phiên bản). Theo đó, bạn có thể đăng ký các lớp trong hai assembly tại các URI khác nhau, sử dụng cùng host. • Cài đặt tất cả các phiên bản của assembly “đối tượng ở xa” vào GAC. Theo đó, bạn có thể tạo một host ánh xạ các URI khác nhau đến các phiên bản cụ thể của assembly “đối tượng ở xa”. Tùy chọn cuối cùng là linh hoạt nhất trong trường hợp bạn cần hỗ trợ nhiều phiên bản. Ví dụ, file cấu hình dưới đây đăng ký hai phiên bản của RemoteObjects tại hai endpoint khác nhau. Bạn cần ghi rõ số phiên bản và token khóa công khai khi sử dụng các assembly trong GAC. Bạn có thể tìm thấy thông tin này bằng cách xem assembly trong Windows Explorer GAC plug-in (vào thư mục C:\Windows\Assembly). <configuration> <system.runtime.remoting> <application> <service> <! Thông tin type được chia thành ba hàng cho hợp với biên trang. Trong file cấu hình, thông tin này phải được đặt trên một hàng. > 505 Chương 12: Dịch vụ Web XML và Remoting <wellknown mode="SingleCall" type="RemoteObjects.RemoteObject, RemoteObjects, Version 1.0.0.1, Culture=neutral, PublicKeyToken=8b5ed84fd25209e1" objectUri="RemoteObj" /> <wellknown mode="SingleCall" type="RemoteObjects.RemoteObject, RemoteObjects, Version 2.0.0.1, Culture=neutral, PublicKeyToken=8b5ed84fd25209e1" objectUri="RemoteObj_2.0" /> </service> <channels> <channel ref="tcp server" port="9080" /> </channels> </application> </system.runtime.remoting> </configuration> File cấu hình của client không phải thay đổi gì hết (trừ việc cập nhật URI, nếu cần). Client “chọn” phiên bản mà nó muốn sử dụng bằng URI tương ứng. Hình 12.4 Thư mục C:\Windows\Assembly 506 Chương 12: Dịch vụ Web XML và Remoting 13. 13. T o ph ng th c m t chi u ạ ươ ứ ộ ề T o ph ng th c m t chi u ạ ươ ứ ộ ề v i d ch v Web XML hay Remotingớ ị ụ v i d ch v Web XML hay Remotingớ ị ụ   Bạn muốn một phương thức web hay một thành phần ở xa thực hiện một tác vụ kéo dài, và bạn không muốn bắt client phải đợi trong lúc mã lệnh đang thực thi.   Tạo một phương thức web một chiều bằng cách áp dụng đặc tính SoapDocumentMethod hay SoapRpcMethod và thiết lập thuộc tính OneWay của đặc tính này là true . Tạo một phương thức Remoting một chiều bằng cách áp dụng đặc tính OneWay thuộc không gian tên System.Runtime.Remoting.Messaging . Với các phương thức một chiều, client gửi một thông điệp yêu cầu, và server đáp ứng tức thì để cho biết rằng phương thức đã bắt đầu quá trình xử lý. Cách làm việc này có các hệ quả sau: • Client không cần đợi trong lúc mã lệnh đang thực thi. • Phương thức không thể trả về thông tin nào cho client (thông qua một giá trị trả về hay một thông số ByRef ). • Nếu phương thức ném một ngoại lệ chưa-được-thụ-lý, nó sẽ không được truyền về cho client. Rõ ràng là các phương thức một chiều không phù hợp khi client cần nhận thông tin từ server. Tuy nhiên, chúng lại lý tưởng khi cần khởi chạy một kiểu tác vụ nào đó phía server (chẳng hạn, bắt đầu một công việc xử lý bó). Để tạo một phương thức web một chiều, bạn cần áp dụng đặc tính SoapDocumentMethod (thuộc không gian tên System.Web.Services.Protocols ) cho phương thức thích hợp và thiết lập thuộc tính OneWay là true . Ví dụ dưới đây là một dịch vụ Web XML có hai phương thức, mỗi phương thức đều gây trì hoãn 10 giây. Một trong hai phương thức này sử dụng đặc tính SoapDocumentMethod (để client không phải đợi 10 giây). using System; using System.Web.Services; using System.Web.Services.Protocols; public class OneWayTestWebService { [WebMethod()] public void DoLongTaskWithWait() { // (Bắt đầu một tác vụ kéo dài và khiến client phải đợi.) Delay(10); } [WebMethod, SoapDocumentMethod(OneWay=true)] public void DoLongTaskWithoutWait() { 507 Chương 12: Dịch vụ Web XML và Remoting // (Bắt đầu một tác vụ kéo dài nhưng không khiến client phải đợi.) Delay(10); } private void Delay(int seconds) { DateTime currentTime = DateTime.Now; while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds) {} } } Ví dụ trên giả định dịch vụ Web XML và client đang sử dụng SOAP document (mặc định). Nếu đang sử dụng Remote Procedure Call (RPC), bạn hãy sử dụng đặc tính tương ứng là SoapRpcMethod để đánh dấu phương thức một chiều. Để tạo một phương thức một chiều trong một thành phần trên Remoting, bạn cần áp dụng đặc tính OneWay (thuộc không gian tên System.Runtime.Remoting.Messaging ) cho phương thức thích hợp. Đoạn mã dưới đây trình bày một ví dụ giống như trên nhưng với một thành phần ở xa: using System; using System.Runtime.Remoting.Messaging; public class OneWayTestRemoting : MarshalByRefObject { public void DoLongTaskWithWait() { // (Bắt đầu một tác vụ kéo dài và khiến client phải đợi.) Delay(10); } [OneWay()] public void DoLongTaskWithoutWait() { // (Bắt đầu một tác vụ kéo dài nhưng không khiến client phải đợi.) Delay(10); } private void Delay(int seconds) { DateTime currentTime = DateTime.Now; while (DateTime.Now.Subtract(currentTime).TotalSeconds < seconds) {} } }  Phương thức một chiều không phải là cách duy nhất để loại bỏ việc trì hoãn client. Bạn cũng có thể điều chỉnh client gọi phương thức web một cách bất đồng 508 Chương 12: Dịch vụ Web XML và Remoting bộ. Trong trường hợp này, client sẽ đợi dịch vụ Web XML hoàn tất, nhưng nó sẽ đợi trên một tiểu trình khác, và do đó client có thể tiếp tục với các công việc khác. Việc gọi phương thức bất đồng bộ đã được mô tả trong mục 12.6. 13 509 Chương 13:BẢO MẬT 510 . có thể thay đổi các thiết lập về thời gian sống. • Host có thể chỉ định các thiết lập mặc định về thời gian sống trong file cấu hình. Các thiết lập này sẽ áp dụng cho tất cả các đối tượng ở. tượng sẽ sống. Ví dụ dưới đây sử dụng cách tiếp cận thứ nhất (dùng thẻ <lifetime> trong file cấu hình của host). Các thiết lập lease áp dụng cho tất cả các đối tượng ở xa do host tạo ra đăng ký các lớp trong hai assembly tại các URI khác nhau, sử dụng cùng host. • Cài đặt tất cả các phiên bản của assembly “đối tượng ở xa” vào GAC. Theo đó, bạn có thể tạo một host ánh xạ các URI

Ngày đăng: 08/07/2014, 17:20

w