Trong một lớp đối tượng hoặc một component- hướng lập trình là cách duy nhất để Client gọi một method tới dịch vụ. Client sẽ thực hiện một cuộc gọi, khóa cuộc gọi khi đang xử lý, và trả lại kết quả khi kết thúc.
WCF hỗ trợ mô hình truyền thống Request-Replay, One-Way call (gọi và không trả lại), callback (dịch vụ gọi tới Client)
Hình 9: Các hình thức giao tiếp giữa Client và Service[15]
Request-Replý
Mặc định tất cả các dịch vụ WCF sẽ thực thi chế độ yêu cầu/phản hồi này. Điều đó có nghĩa khi Client yêu cầu tới WCF Service và Client sẽ đợi kết quả trả về từ Service( vẫn có receiveTimeout). Sau khi nhận trả lại kết quả, nó sẽ bắt đầu thực thi tiếp công đoạn còn lại, nhưng nếu dịch vụ không trả lại trong thời gian receiveTimeout, Client sẽ nhận được TimeOutException.
Ngoài NetPeerTcpBinding, NetMsmqBinding và tất cả các binding khác đều hỗ trợ request-reply
Hình 10: Hình thức giao tiếp Request-Replý[15]
One-Way
Trong chế độ One-Way, Client sẽ gửi yêu cầu tới Server và không quan tâm tới nó có thành công hay thất bại. Server không trả lại kết quả, vì vậy gọi là giao dịch một chiều. Client sẽ chỉ khóa một thời gian cho đến khi nó gửi yêu cầu tới máy chủ, và các lỗi ngoại lệ cũng sẽ không đến được máy chủ.
Client vẫn có thể tiếp tục thực thi sau khi gọi One-way tới Server. Nó không cần phải đợi cho đến khi Server thực hiện xong. Thỉnh thoảng, khi có lời gọi One-way tới service, chúng có thể sẽ không được gửi đi tất cả một lúc, mà sẽ được đưa vào hàng đợi, nếu số lượng tin nhắn được đưa vào hàng đợi vượt quá khả năng đáp ứng, nó sẽ chặn tất cả, thậm chí cả liên lạc một chiều. Tuy nhiên, khi có lời gọi yêu cầu, Client sẽ mở khóa và tiếp tục thực hiện, trong khi Server sẽ xử lý các thao tác trong phần tiếp theo
Hình 11: Hình thức giao tiếp One- way[15]
Liên lạc One-way có thể được khởi tạo bằng cách thiết lập thuộc tính IsOneWay = true trong thuộc tính Operation contract.
[ServiceContract]
public interface IMyService {
[OperationContract(IsOneWay=true)] void MyMethod(EmployeeDetails emp); }
Chúng ta hãy theo dõi ví dụ sau, điều gi đang xảy ra khi sử dụng giao tiếp one- way với Sessionful service?
[ServiceContract(SessionMode = SessionMode.Required)] interface IMyContract { [OperationContract(IsOneWay = true)] void MyMethod(); }
Khi Client thực hiện một lời gọi One-way với MyMethod() và nếu như đóng proxy. Client sẽ bị khóa cho đến khi thao tác được thực hiện xong. Dịch vụ one- way áp dụng cho kiểu per-call và singleton service.
Giả sử nếu sử dụng dịch vụ One-way trong Sessionful service, sử dụng trong thao tác cuối cùng sẽ chấm dứt hoạt động của Session. Thì operation này không nên trả về bất kỳ giá trị nào. [ServiceContract(SessionMode = SessionMode.Required)] interface IMyContract { [OperationContract] void MyMethod1(); [OperationContract] string MyMethod2();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
string CloseSessionService(int id); }
One-Way Operations và ngoại lệ
Nếu sử dụng BasicHttpBinding hay WSHttpBinding,… không sử dụng session vận chuyển, nếu như có bất kỳ ngoại lệ ném ra bởi service thì sẽ không tác động đến Client. Client có thể làm một lời gọi tới service sử dụng cùng một proxy.
[ServiceContract] interface IMyContract {
[OperationContract(IsOneWay = true)] void MethodWithError( );
[OperationContract]
void MethodWithoutError( ); }
MyContractClient proxy = new MyContractClient( ); proxy.MethodWithError( );
proxy.MethodWithoutError( ); proxy.Close( );
Trong trường hợp có sử dụng session vận chuyển, dù có bất kỳ lỗi nào xảy ra bởi service cũng sẽ có lỗi tới Client Channel. Client sẽ không có khả năng làm một lời gọi mới sử dụng cùng một thể hiện proxy nữa.
MyContractClient proxy = new MyContractClient( ); proxy.MethodWithError( );
proxy.MethodWithoutError( ); proxy.Close( );
Callback Service
Chúng ta thấy rằng tất cả Client gọi tới service để lấy hoặc làm một cái gì đó. Nhưng WCF cũng cho phép service gọi tới Client. Bằng cách này, service sẽ như một Client và Client giống như một service.
Giao thức HTTP được sử dụng như một kết nối tự nhiên, bởi vậy nó không hỗ trợ callback operation. Do đó BasicHttpBinding và WSHttpBinding không thể sử dụng cho thao tác này được.
WCF hỗ trợ WSDualHttpBinding cho lời gọi call back.
Tất cả giao thức TCP và IPC đều hỗ trợ giao tiếp Duplex. Bởi vậy, tất cả các binding đó đều được sử dụng cho callback operation.
Định nghĩa và cấu hình một callback contract
Callback service có thể được khởi tạo bằng cách sử dụng thuộc tính CallbackContract trong thuộc tính ServiceContract. Bằng ví dụ dưới đây, chúng ta có thể cấu hình như sau:
public interface IMyContractCallback {
[OperationContract] void OnCallback();
}
[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
public interface IMyContract {
[OperationContract()] void MyMethod(); }
Hình 12: Hình thức giao tiếp Duplex[15] Thiết lập Client Callback
Trong callback thì Client sẽ như một service và service sẽ như một Client. Vì vậy, Client phải đưa ra một endpoint để service có thể gọi lại. InstanceContext sẽ thực thi ở phạm vi bên trong phần lớn service instance. Nó cung cấp một constructor để service instance có thể host.
IMyContractCallback callback=new MyCallback(); InstanceContext cntx=new InstanceContext(callback); MyServiceClient proxy = new MyServiceClient(cntx); proxy.MyMethod();
Client phải sử dụng một proxy để nó thiết lập giao tiếp 2 chiều và tham chiếu đến endpoint cho service. Điều này có thể đạt được, bằng cách tạo một proxy sử dụng DuplexClientBase
class MyServiceClient:DuplexClientBase,IMyContract {
public MyServiceClient(InstanceContext callbackCntx) : base(callbackCntx)
}
public void MyMethod() {
base.Channel.MyMethod(); }
}
Gọi Service-Side Callback
Client-side callback endpoint được tham chiếu theo tất cả các lời gọi đến dịch vụ từ Client, nó là một phần của tin nhắn đến. OperationContext class cung cấp cho dịch vụ dễ dàng truy cập đến callback thông qua phương thức chung
GetCallbackChannel<T>( ). Service có thể gọi Client side callback method bằng cách tham chiếu đến thể hiện của Client side callback. Đoạn code dưới đây sẽ chỉ rõ cách gọi phương thức callback.
IMyContractCallback callbackInstance=
OperationContext.Current.GetCallbackChannel(); callbackInstance.OnCallback();
2.9 Hành xử( Behavior)
Hành xử dịch vụ ( Service Behivior)
Các hành xử dịch vụ là một khía cạnh thực hiện phụ thuộc vào các giải pháp tầng dịch vụ. Các thuộc tính ServiceBehavior chỉ áp dụng tại các cấp class. Mặc dù các thuộc tính ServiceContract được áp dụng tại giao diện của cả hai hợp đồng và các cấp class.
Một số thuộc tính như:
Currency: Kiểm soát hành xử xử lí một đối tượng và hỗ trợ cuộc gọi. Chỉ có hiệu lực nếu thuộc tính Instancing không phải là PerCall.
Instancing: Kiểm soát và điều khiển việc tạo vòng đời của đối tượng. Mặc định là PerCall, một đối tượng mới trên mỗi cuộc gọi phương thức. Nói chung, trong dịch vụ định hướng session, PerSession hoặc Shareable có thể cung cấp hiệu suất tốt hơn, mặc dù ở mức chi phí quản lý đồng thời.
Throttling: Quản lý thông qua cấu hình, khi đồng thời cho phép cho các nhiều cuộc gọi, hạn chế số lượng cuộc gọi đồng thời, kết nối, tổng số trường hợp và hoạt động chờ.
Transaction: Kiểm soát các khía cạnh giao dịch.
Hành xử hợp đồng ( Contract Behivior)
Thực thi trên giao diện System.ServiceModel.Description.IContractBehavior. Hành xử này có thể tùy biến khi chạy, liên quan đến DispatchRuntime / ClientRuntime và có thể được thêm vào thuộc tính trong mã. Chúng ta có thể thêm một hành xử hợp đồng lập trình. foreach (ServiceEndpoint se in host.Description.Endpoints) { se.Contract.Behaviors.Add(new CustomBehavior); }
Hành xử thao tác ( Operation Behivior)
Thực thi giao diện System.ServiceModel.Description.IOperationBehavior. Có thể tùy chỉnh thực thi bằng cách tùy chỉnh các đối tượng Operation/ ClientOperation.
Hành xử này có thể được thêm bằng cách thêm thuộc tính hoặc lập trình. foreach (ServiceEndpoint se in host.Description.Endpoints) { foreach (OperationDescription od in se.Contract.Operations) { od.Behaviors.Add(new CustomBehavior); } }
Hành xử điểm cuối( EndpointBehavior)
Thực thi giao diện System.ServiceModel.Description.IEndpointBehavior. Hành xử này có thể tùy biến dựa trên đối tượng EndpointDispatcher. Có thể được thêm vào bằng cách cấu hình hoặc lập trình.
foreach (ServiceEndpoint se in
host.Description.Endpoints) se.Behaviors.Add(new CustomBehavior());
2.10 Chanel Stack
Trong WCF tất cả các giao tiếp chi tiết đều được xử lý bởi kênh, đó là một stack component mà tất cả các tin nhắn phải đi qua trong suốt tiến trình xử lý. Đáy của component thường là một chanel vận chuyển, được thực thi bởi giao thức vận chuyển và gửi các tin nhắn đi. kênh vận chuyển sử dụng một bộ mã hóa tin nhắn để đọc các byte đến vào một đối tượng hợp lý và chế biến tiếp.
Sau đó, tin nhắn đẩy lên trong phần còn lại của Chanel stack, mỗi kênh giao thức đều có nhiệm vụ chế biến bản tin, cho đến khi nó nổi lên đầu và WCF có tín hiệu cuối cùng thực hiện dịch vụ. Tin nhắn sẽ bị biến đổi đáng kể trên đường đi. Rất khó
để phát triển và làm việc trực tiếp với kiến trúc của chanel stack, bởi vậy WCF cung cấp 1 cách dễ dàng hơn bằng cách sử dụng điểm cuối.
WCF endpoint giao tiếp với thế giới bằng cách sử dụng một stack giao tiếp gọi là Channel stack. Thông điệp truyền thông lưu thông qua ngăn xếp là các tin nhắn. Các kênh phía dưới được gọi là một kênh giao thông. Đây là kênh có trách nhiệm gửi và nhận tin nhắn đến và đi từ các bên khác. Trên các kênh vận chuyển có thể có nhiều các kênh giao thức có trách nhiệm cung cấp một chức năng giao tiếp, đảm bảo cung cấp đáng tin cậy bằng cách thêm các tiêu đề hoặc mã hóa nội dung, xác nhận giấy biên nhận.
Hình 13: Channel Stack
Channel stacks sử dụng một Factory Pattern, nơi tạo một Channel Stack. Ở phía gửi, một hành xử được sử dụng để xây dựng một Channel Factory, nó sẽ xây dựng một Channel Stack và trả lại một con trỏ tham chiếu đến đỉnh Channel trên Stack. Ứng dụng có thể sử dụng để gửi tin nhắn. Các bước để gửi và nhận một tin nhắn:
Tạo một Binding
Xây dựng một Channel Factory.
Tạo một Channel.
Gửi một Request và đọc phản hồi.
Đóng tất cả các kênh
Ở phía nhận, một binding sẽ được sử dụng để xây dựn một giao diện IChannelListener, nghe tất cả các tin nhắn đến. IChannelListener cung cấp các tin nhắn đến ứng dụng bằng cách tạo ra các Channel Factory và tham chiếu đến đầu các kênh. Các ứng dụng sau đó sử dụng kênh này để nhận các thư đến.
Các bước như sau:
Tạo một Binding.
Mở Channel Listener.
Đọc các yêu cầu đến và gửi phản hồi.
Đóng tất cả các Channel Objects.
2.11 Chanel
Chanel là kênh mà tất cả các tin nhắn đều đến hoặc đi từ ứng dụng WCF, Chanel xác định hình thức vận chuyển, giao thức…, từ Channel sẽ tạo ra các ChanelStack, các ChanelStack này sẽ cho phép gửi và nhận tin nhắn từ các đặc trưng riêng phụ thuộc vào cấu hình Binding, có hai loại kênh là kênh vận chuyển và kênh giao thức, Transport Channel thường ở phía dưới của Channel Stack, là hình thức sử dụng giao thức vận chuyển. Protocol Chanel thường ở phía trên của Channel Stack, hỗ trợ một số tính năng như bảo mật, phiên, độ tin cậy của tin nhắn.
Trong quá trình giao tiếp, ở Client và Services đều tạo ra các Chanel Stack tương ứng bằng cách sử dụng Binding, Bindings là một tập hợp từ các Binding element, mỗi Binding element sẽ tạo một Channel trong Channel Stack.
Trên đây là luồng tin nhắn đi từ ứng dụng Client thông qua Client Channel Stack tới Server Channel Stack, thông qua bộ điều phối để đến ứng dụng phía Server.
Trên đỉnh của Chanel Stack là protocol Channel, protocol Channel tương tác với tin nhắn, và một số tính năng như bảo mật, phiên, tin cậy, lưu vết…Transport Channel lại đại diện cho khả năng gửi và nhận byte qua một giao thức vận chuyển như TCP hay HTTP, có thể kèm theo mã hóa tin nhắn. Channel có thể có ít nhất một chức năng vận chuyển và mã hóa.
Chanel Listener
Chanel Listener là một lớp cơ bản của WCF phía services side, nhiệm vụ cơ bản là theo dõi các tin nhắn đến services từ chanel stack và tham chiếu từ đỉnh stack tới ứng dụng. chúng nhận tin nhắn từ transport Channel hoặc Channel từ phía dưới, phần lớn các lập trình viên làm việc trực tiếp với Channel Listener thông qua class service host.
Chanel Factory
Channel Factory tạo ra một kênh để gửi tin nhắn và duy trì quyền sở hữu của các kênh nó tạo ra. Hầu hết các nhà phát triển không bao giờ sử dụng một Channel Factory trực tiếp. Điều quan trọng để hiểu Chanel Factory là bởi chúng hình thành cơ sở cho phía Client truyền tin trong WCF.
Một khác biệt quan trọng giữa Channel Listener và Channel Factory là các Chanel Factory chịu trách nhiệm đóng cửa tất cả các kênh liên quan, trong khi Channel Listener thì không. Sự khác biệt này đã được thực hiện để Listener có thể được tắt độc lập với các kênh của chúng.
Chanel Factory và Chanel Listener hình thành cơ sở cho việc gửi và nhận tin nhắn. Chúng có trách nhiệm tạo ra các ngăn xếp kênh và đưa ra Chanel Stack tới các ứng dụng. Mọi dịch vụ WCF có ba thành phần chính: Một service class, thực hiện trong C#, VB hoặc ngôn ngữ khác ở CLR, một host process để hosting dịch vụ, một hoặc nhiều thiết bị endpoint cho phép khách hàng truy cập dịch vụ. Tất cả các thông tin liên lạc với một WCF dịch vụ xảy ra thông qua endpoint.
Phía dịch vụ: cần các bước như (định nghĩa hợp đồng, thực thi hợp đồng, định nghĩa Endpoint, host và chạy dịch vụ). Phía trình khách: Tạo Proxy từ siêu dữ liệu, sau đó chạy dịch vụ.
2.12 Điều phối (Dispatcher)
Dispatcher là tập hợp các kiểu trong class ServiceModel tại ứng dụng nhận. Dispathcher thuộc namespace System.ServiceModel.Dispatcher. Các nhiệm vụ được thực hiện bởi các ChannelDispatcher và các loại tham chiếu bởi
ChannelDispatcher:
Tạo ra một kênh nghe từ ràng buộc
Quản lý kênh nhận được từ người nghe
Quản lý các vòng lặp nghe
Quản lý thời gian tồn tại của người nghe kênh và các ngăn xếp kênh kết quả
Hạn chế tốc độ mà tại đó các tin nhắn nhận được từ ngăn xếp kênh (cũng được gọi là throttling)
Quản lý việc tạo, vòng đời, và số lượng của các đối tượng dịch vụ
Định tuyến nhận tin nhắn cho các đối tượng dịch vụ
Deserializing đối tượng có ý nghĩa từ tin nhắn nhận được
Sử dụng các đối tượng deserialized để gọi một phương thức trên một đối tượng dịch vụ
Serializing giá trị trả lại của phương thức đối tượng dịch vụ vào các tin nhắn trả lời
Routing tin nhắn trả lời để ngăn xếp kênh thích hợp và gửi trở lại cho người gửi thông qua đó ngăn xếp kênh
Xử lý sai sót trong những nhiệm vụ trước
Quản lý thực hiện hành vi mặc định và tùy chỉnh trong các nhiệm vụ trước
Hình 15: Channel Dispatcher
2.13 Quản lý đối tƣợng-Instance Management
Quản lý đối tượng liên quan đến các dịch vụ khi xử lý một yêu cầu từ khách hàng. Quản lý đối tượng là tập hợp các kỹ thuật WCF sử dụng để yêu cầu Client liên kết với dịch vụ. Nó cần thiết bởi vì các ứng dụng sẽ khác nhau thì nhu cầu đối với khả năng mở rộng, hiệu suất, độ bền, giao dịch và các lời gọi hàng đợi sẽ khác nhau. Thông thường có 3 mô hình đối tượng như sau trong WCF:
2.13.1 Per-Call Service
Khi dịch vụ WCF thiết lập chế độ Per-Call, Service Instance sẽ được tạo ra trong mỗi lần gọi tới dịch vụ từ mỗi yêu cầu của Client. Service Instance này sẽ bị hủy sau khi trả kết quả lại cho Client.
Hình 16: Per-call[15]
Mô hình sau đây đại diện cho tiến trình xử lý yêu cầu từ Client khi thiết lập chế độ Per-Call
Hình 17: Tiến trình Per call[15]
Tất cả các yêu cầu dịch vụ đều trả về '1', bởi vì chúng ta đã thiết lập Instance mode bằng Per-Call. Service instance sẽ tạo cho mỗi request và giá trị biến tĩnh sẽ được thiết lập.
2.13.2 Per-Session Service
Khi WCF service cấu hình là Per-Session Instance mode, các session giữa Client và Service sẽ được lưu trữ lại, khi Client tạo một Proxy mới trên dịch vụ cụ thể, một trường hợp dịch vụ chuyên dụng sẽ được cung cấp cho khách hàng. Nó độc lập với tất cả các trường hợp khác. Mô hình sau sẽ mô tả yêu cầu từ Client tới