WCF - Hướng dẫn nhanh

WCF là viết tắt của Windows Communication Foundation. Tính năng cơ bản của WCF là khả năng tương tác. Đây là một trong những công nghệ mới nhất của Microsoft được sử dụng để xây dựng các ứng dụng hướng dịch vụ. Dựa trên khái niệm truyền thông dựa trên thông điệp, trong đó một yêu cầu HTTP được thể hiện một cách thống nhất, WCF làm cho nó có thể có một API thống nhất bất kể các cơ chế truyền tải đa dạng.

WCF được phát hành lần đầu tiên vào năm 2006 như một phần của .NET framework với Windows Vista, sau đó được cập nhật nhiều lần. WCF 4.5 là phiên bản mới nhất hiện đang được sử dụng rộng rãi.

Một ứng dụng WCF bao gồm ba thành phần:

  • Dịch vụ WCF,
  • Máy chủ dịch vụ WCF và
  • Máy khách dịch vụ WCF.

Nền tảng WCF còn được gọi là Mô hình Dịch vụ.

Các khái niệm cơ bản về WCF

Thông điệp

Đây là một đơn vị liên lạc bao gồm một số bộ phận ngoài cơ thể. Các phiên bản tin nhắn được gửi cũng như nhận cho tất cả các loại giao tiếp giữa máy khách và dịch vụ.

Điểm cuối

Nó xác định địa chỉ nơi gửi hoặc nhận một tin nhắn. Nó cũng chỉ định cơ chế giao tiếp để mô tả cách các thông điệp sẽ được gửi cùng với việc xác định tập hợp các thông điệp. Cấu trúc của một điểm cuối bao gồm các phần sau:

Địa chỉ

Địa chỉ chỉ định vị trí chính xác để nhận tin nhắn và được chỉ định làm Định danh tài nguyên đồng nhất (URI). Nó được biểu thị dưới dạng lược đồ: // domain [: port] / [path]. Hãy xem địa chỉ được đề cập bên dưới -

net.tcp: // localhost: 9000 / ServiceA

Ở đây, 'net.tcp' là lược đồ cho giao thức TCP. Miền là 'localhost' có thể là tên của máy hoặc miền web và đường dẫn là 'ServiceA'.

Ràng buộc

Nó xác định cách một điểm cuối giao tiếp. Nó bao gồm một số yếu tố ràng buộc tạo nên cơ sở hạ tầng cho giao tiếp. Ví dụ, một ràng buộc cho biết các giao thức được sử dụng để truyền tải như TCP, HTTP, v.v., định dạng mã hóa thông báo và các giao thức liên quan đến bảo mật cũng như độ tin cậy.

Hợp đồng

Nó là một tập hợp các hoạt động chỉ định chức năng mà điểm cuối hiển thị cho khách hàng. Nó thường bao gồm một tên giao diện.

Lưu trữ

Lưu trữ theo quan điểm của WCF đề cập đến dịch vụ lưu trữ WCF có thể được thực hiện thông qua nhiều tùy chọn có sẵn như lưu trữ tự lưu trữ, lưu trữ IIS và lưu trữ WAS.

metadata

Đây là một khái niệm quan trọng của WCF, vì nó tạo điều kiện tương tác dễ dàng giữa ứng dụng khách và dịch vụ WCF. Thông thường, siêu dữ liệu cho dịch vụ WCF được tạo tự động khi được bật và điều này được thực hiện bằng cách kiểm tra dịch vụ và các điểm cuối của nó.

Khách hàng WCF

Một ứng dụng khách được tạo để hiển thị các hoạt động dịch vụ dưới dạng các phương thức được gọi là ứng dụng khách WCF. Điều này có thể được lưu trữ bởi bất kỳ ứng dụng nào, ngay cả ứng dụng lưu trữ dịch vụ.

Kênh

Kênh là một phương tiện thông qua đó khách hàng giao tiếp với một dịch vụ. Các loại kênh khác nhau được xếp chồng lên nhau và được gọi là Ngăn xếp kênh.

XÀ BÔNG TẮM

Mặc dù được gọi là 'Giao thức truy cập đối tượng đơn giản', SOAP không phải là giao thức truyền tải; thay vào đó, nó là một tài liệu XML bao gồm phần đầu và phần nội dung.

Ưu điểm của WCF

  • Nó có thể tương tác với các dịch vụ khác. Điều này trái ngược hẳn với .NET Remoting, trong đó cả máy khách và dịch vụ đều phải có .Net.

  • Dịch vụ WCF cung cấp độ tin cậy cũng như bảo mật nâng cao so với các dịch vụ web ASMX (Active Server Method).

  • Việc triển khai mô hình bảo mật và thay đổi ràng buộc trong WCF không yêu cầu thay đổi lớn về mã hóa. Chỉ cần một vài thay đổi cấu hình để đáp ứng các hạn chế.

  • WCF có cơ chế ghi nhật ký tích hợp trong khi trong các công nghệ khác, điều cần thiết là phải thực hiện mã hóa.

  • WCF đã tích hợp AJAX và hỗ trợ JSON (ký hiệu đối tượng JavaScript).

  • Nó cung cấp khả năng mở rộng và hỗ trợ các tiêu chuẩn dịch vụ web sắp ra mắt.

  • Nó có một cơ chế bảo mật mặc định cực kỳ mạnh mẽ.

Có một số khác biệt chính tồn tại giữa WCF và dịch vụ Web được liệt kê bên dưới.

  • Attributes - Dịch vụ WCF được định nghĩa bởi các thuộc tính ServiceContract và OperationContract, trong khi một dịch vụ web được xác định bởi các thuộc tính WebService và WebMethod.

  • Protocols - WCF hỗ trợ một loạt các giao thức, chẳng hạn như HTTP, Named Pipes, TCP và MSMQ, trong khi dịch vụ web chỉ hỗ trợ giao thức HTTP.

  • Hosting Mechanisms - Có nhiều cơ chế kích hoạt khác nhau cho lưu trữ WCF, tức là IIS (Dịch vụ thông tin Internet), WAS (Dịch vụ kích hoạt Windows), Dịch vụ tự lưu trữ và Windows, nhưng một dịch vụ web chỉ được lưu trữ bởi IIS.

  • Services - WCF hỗ trợ bảo mật mạnh mẽ, nhắn tin đáng tin cậy, giao dịch và khả năng tương tác, trong khi dịch vụ web chỉ hỗ trợ các dịch vụ bảo mật.

  • Serializer - WCF hỗ trợ bộ tuần tự DataContract bằng cách sử dụng System.Runtime.Serialization, trong khi dịch vụ web hỗ trợ bộ tuần tự hóa XML bằng cách sử dụng System.Xml.Serialization.

  • Tools - Công cụ ServiceMetadata (svcutil.exe) được sử dụng để tạo máy khách cho dịch vụ WCF, trong khi công cụ WSDL.EXE được sử dụng để tạo cùng một dịch vụ web.

  • Exception Handling- Trong WCF, các ngoại lệ không được xử lý sẽ được xử lý theo cách tốt hơn bằng cách sử dụng FaultContract. Chúng không quay trở lại máy khách giống như trong một dịch vụ web do lỗi SOAP.

  • Hash Table - Có thể tuần tự hóa Bảng băm trong WCF, nhưng trường hợp này không đúng trong dịch vụ web.

  • Bindings - WCF hỗ trợ một số loại ràng buộc như BasicHttpBinding, WSDualHttpBinding, WSHttpBinding, v.v., trong khi dịch vụ web chỉ hỗ trợ SOAP hoặc XML.

  • Multithreading - WCF hỗ trợ đa luồng bằng cách sử dụng Lớp ServiceBehavior, trong khi điều này không được hỗ trợ trong dịch vụ web.

  • Duplex Service Operations - WCF hỗ trợ các hoạt động dịch vụ song công ngoài việc hỗ trợ các hoạt động dịch vụ một chiều và theo yêu cầu, trong khi dịch vụ web không hỗ trợ các hoạt động dịch vụ song công.

Để phát triển một ứng dụng dịch vụ WCF, chủ yếu có hai công cụ - Microsoft Visual Studio và CodePlex. Microsoft Visual Studio là một gói công cụ phát triển hoàn chỉnh, cần thiết để phát triển một số lượng lớn các ứng dụng đa dạng như ứng dụng web ASP.NET, ứng dụng máy tính để bàn, ứng dụng di động và nhiều ứng dụng khác.

Microsoft Visual Studio sử dụng chức năng .NET framework. Mặt khác, CodePlex là một trang web lưu trữ dự án mã nguồn mở của Microsoft cung cấp một số công cụ miễn phí để phát triển ứng dụng dịch vụ WCF.

Microsoft Visual Studio

Có rất nhiều phiên bản của Microsoft Visual Studio và ban đầu nó (Visual Studio 2005) không phải là người ủng hộ nhiệt tình cho sự phát triển WCF. Hiện tại, Visual Studio 2008 là IDE Microsoft duy nhất có sẵn để phát triển các ứng dụng dịch vụ WCF.

Ngày nay, phiên bản mới nhất của Microsoft Visual Studio 2010 cũng là một công cụ được ưa chuộng để phát triển ứng dụng dịch vụ WCF. Ngoài ra còn có một mẫu làm sẵn trong Visual Studio để phát triển ứng dụng dịch vụ WCF.

Việc lựa chọn một mẫu như vậy dẫn đến việc bổ sung các tệp cho các mục đích sau:

  • Hợp đồng dịch vụ
  • Thực hiện dịch vụ
  • Cấu hình dịch vụ

Các thuộc tính tinh tế được thêm tự động và một dịch vụ "Hello World" đơn giản được tạo bởi Microsoft Visual Studio mà không cần viết bất kỳ mã nào.

CodePlex

CodePlex được Microsoft tung ra vào tháng 6 năm 2006 và kể từ đó, nó đã được một số lượng lớn các nhà phát triển trên toàn thế giới sử dụng để tạo thành công các dự án .NET. Một số công cụ do CodePlex cung cấp để phát triển các ứng dụng dịch vụ WCF như sau:

  • wscf.blue- Đây là phần bổ trợ Microsoft Visual Studio và cũng là bộ công cụ phát triển "hợp đồng đầu tiên" tạo điều kiện thuận lợi cho việc xác định các hoạt động dịch vụ WCF và tạo khung mã cho phù hợp. Một liên kết quan trọng cho cùng một là -https://wscfblue.codeplex.com

  • WCFProxyGenerator- Đây cũng là một phần bổ trợ Microsoft Visual Studio. Công cụ này được sử dụng để mở rộng quá trình tạo phía máy khách và cung cấp thêm xử lý lỗi. Để có thêm thông tin về công cụ phát triển cụ thể này, hãy truy cậphttps://wcfproxygenerator.codeplex.com

  • WCFMock- Kiểm tra dịch vụ WCF có thể là một nhiệm vụ phức tạp và công cụ phát triển này cung cấp một giải pháp thuận tiện cho việc kiểm tra đơn vị dịch vụ WCF bằng các lớp hữu ích của nó. Để biết thêm thông tin về công cụ này, hãy truy cậphttps://wcfmock.codeplex.com

Một công cụ miễn phí khác để phát triển các ứng dụng dịch vụ WCF một cách dễ dàng là WCFStorm. Phiên bản LITE của nó cung cấp nhiều tính năng nổi bật để gọi động và thử nghiệm các dịch vụ WCF, chỉnh sửa ràng buộc dịch vụ, sửa đổi điểm cuối URL WCF, v.v.

WCF có kiến ​​trúc phân lớp cung cấp nhiều hỗ trợ cho việc phát triển các ứng dụng phân tán khác nhau. Kiến trúc được giải thích chi tiết bên dưới.

Hợp đồng

Lớp hợp đồng nằm ngay bên cạnh lớp ứng dụng và chứa thông tin tương tự như hợp đồng trong thế giới thực chỉ định hoạt động của một dịch vụ và loại thông tin có thể truy cập mà nó sẽ tạo ra. Hợp đồng về cơ bản có bốn loại được thảo luận ngắn gọn dưới đây -

  • Service contract - Hợp đồng này cung cấp thông tin cho khách hàng cũng như thế giới bên ngoài về các dịch vụ của điểm cuối và các giao thức được sử dụng trong quá trình giao tiếp.

  • Data contract- Dữ liệu được trao đổi bởi một dịch vụ được xác định bởi một hợp đồng dữ liệu. Cả khách hàng và dịch vụ phải đồng ý với hợp đồng dữ liệu.

  • Message contract- Một hợp đồng dữ liệu được kiểm soát bởi một hợp đồng tin nhắn. Nó chủ yếu thực hiện việc tùy chỉnh định dạng kiểu của các tham số thông báo SOAP. Ở đây, cần đề cập rằng WCF sử dụng định dạng SOAP cho mục đích giao tiếp. SOAP là viết tắt của Simple Object Access Protocol.

  • Policy and Binding- Có một số điều kiện trước để giao tiếp với một dịch vụ và các điều kiện đó được xác định bởi chính sách và hợp đồng ràng buộc. Khách hàng cần tuân theo hợp đồng này.

Thời gian chạy dịch vụ

Lớp thời gian chạy dịch vụ nằm ngay dưới lớp hợp đồng. Nó chỉ định các hành vi dịch vụ khác nhau xảy ra trong thời gian chạy. Có nhiều loại hành vi có thể trải qua cấu hình và nằm trong thời gian chạy dịch vụ.

  • Throttling Behavior - Quản lý số lượng tin nhắn được xử lý.

  • Error Behavior - Xác định kết quả của bất kỳ lỗi dịch vụ nội bộ nào.

  • Metadata Behavior - Chỉ định tính khả dụng của siêu dữ liệu với thế giới bên ngoài.

  • Instance Behavior - Xác định số lượng phiên bản cần được tạo để cung cấp chúng cho khách hàng.

  • Transaction Behavior - Cho phép thay đổi trạng thái giao dịch trong trường hợp thất bại.

  • Dispatch Behavior - Kiểm soát cách thức mà một thông báo được xử lý bởi cơ sở hạ tầng của WCF.

  • Concurrency Behavior - Kiểm soát các chức năng chạy song song trong giao tiếp máy khách-máy chủ.

  • Parameter Filtering - Tính năng quá trình xác thực các tham số cho một phương thức trước khi nó được gọi.

Nhắn tin

Lớp này, bao gồm một số kênh, chủ yếu xử lý nội dung thông điệp được giao tiếp giữa hai điểm cuối. Một tập hợp các kênh tạo thành một ngăn xếp kênh và hai loại kênh chính bao gồm ngăn xếp kênh là những loại sau:

  • Transport Channels - Các kênh này hiện diện ở cuối ngăn xếp và chịu trách nhiệm gửi và nhận tin nhắn bằng các giao thức truyền tải như HTTP, TCP, Peer-to-Peer, Named Pipes và MSMQ.

  • Protocol Channels - Trình bày ở trên cùng của một ngăn xếp, các kênh này còn được gọi là các kênh phân lớp, thực hiện các giao thức cấp dây bằng cách sửa đổi các thông báo.

Kích hoạt và Lưu trữ

Lớp cuối cùng của kiến ​​trúc WCF là nơi mà các dịch vụ thực sự được lưu trữ hoặc có thể được thực thi để khách hàng dễ dàng truy cập. Điều này được thực hiện bởi các cơ chế khác nhau được thảo luận ngắn gọn bên dưới.

  • IIS- IIS là viết tắt của Internet Information Service. Nó cung cấp vô số lợi ích khi sử dụng giao thức HTTP của một dịch vụ. Ở đây, không bắt buộc phải có mã máy chủ để kích hoạt mã dịch vụ; thay vào đó, mã dịch vụ được kích hoạt tự động.

  • Windows Activation Service- Điều này thường được gọi là WAS và đi kèm với IIS 7.0. Cả giao tiếp dựa trên HTTP và không dựa trên HTTP đều có thể thực hiện được ở đây bằng cách sử dụng giao thức TCP hoặc Namedpipe.

  • Self-hosting- Đây là cơ chế mà dịch vụ WCF được tự lưu trữ dưới dạng ứng dụng bảng điều khiển. Cơ chế này mang lại sự linh hoạt đáng kinh ngạc trong việc lựa chọn các giao thức mong muốn và thiết lập lược đồ địa chỉ riêng.

  • Windows Service - Lưu trữ một dịch vụ WCF với cơ chế này là thuận lợi, vì các dịch vụ sau đó vẫn được kích hoạt và có thể truy cập được đối với máy khách do không cần kích hoạt thời gian chạy.

Tạo dịch vụ WCF là một công việc đơn giản bằng cách sử dụng Microsoft Visual Studio 2012. Dưới đây là phương pháp từng bước để tạo dịch vụ WCF cùng với tất cả mã hóa cần thiết, để hiểu khái niệm này theo cách tốt hơn.

  • Khởi chạy Visual Studio 2012.
  • Nhấp vào dự án mới, sau đó trong thẻ Visual C #, chọn tùy chọn WCF.

Một dịch vụ WCF được tạo ra để thực hiện các phép toán số học cơ bản như cộng, trừ, nhân và chia. Mã chính nằm trong hai tệp khác nhau - một giao diện và một lớp.

WCF chứa một hoặc nhiều giao diện và các lớp được triển khai của nó.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibrary1 {
   // NOTE: You can use the "Rename" command on the "Refactor" menu to 
   // change the interface name "IService1" in both code and config file 
   // together.

   [ServiceContract]
   Public interface IService1 {
      [OperationContract]
      int sum(int num1, int num2);

      [OperationContract]
      int Subtract(int num1, int num2);

      [OperationContract]
      int Multiply(int num1, int num2);

      [OperationContract]
      int Divide(int num1, int num2);
   }

   // Use a data contract as illustrated in the sample below to add 
   // composite types to service operations.

   [DataContract]
   Public class CompositeType {
      Bool boolValue = true;
      String stringValue = "Hello ";

      [DataMember]
      Public bool BoolValue {
         get { return boolValue; }
         set { boolValue = value; }
      }

      [DataMember]   
      Public string StringValue {
         get { return stringValue; }
         set { stringValue = value; }
      }
   }
}

Mã đằng sau lớp của nó được đưa ra dưới đây.

using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Runtime.Serialization;
usingSystem.ServiceModel;
usingSystem.Text;

namespace WcfServiceLibrary1 {
   // NOTE: You can use the "Rename" command on the "Refactor" menu to 
   // change the class name "Service1" in both code and config file 
   // together.

   publicclassService1 :IService1 {
      // This Function Returns summation of two integer numbers
      
      publicint sum(int num1, int num2) {
         return num1 + num2;
      }
      
      // This function returns subtraction of two numbers. 
      // If num1 is smaller than number two then this function returns 0
      
      publicint Subtract(int num1, int num2) {
         if (num1 > num2) {
            return num1 - num2;
         }
         else {
            return 0;
         }
      }
      
      // This function returns multiplication of two integer numbers.
      publicint Multiply(int num1, int num2) {
         return num1 * num2;
      }
      
      // This function returns integer value of two integer number. 
      // If num2 is 0 then this function returns 1.
      publicint Divide(int num1, int num2) {
         if (num2 != 0) {
            return (num1 / num2);
         } else {
            return 1;
         }
      }
   }
}

Để chạy dịch vụ này, hãy nhấp vào nút Bắt đầu trong Visual Studio.

Trong khi chúng tôi chạy dịch vụ này, màn hình sau sẽ xuất hiện.

Khi nhấp vào phương pháp tính tổng, trang sau sẽ mở ra. Tại đây, bạn có thể nhập hai số nguyên bất kỳ và nhấp vào nút Gọi. Dịch vụ sẽ trả về tổng của hai số đó.

Giống như tính tổng, chúng ta có thể thực hiện tất cả các phép toán số học khác được liệt kê trong menu. Và đây là những điểm nhanh cho họ.

Trang sau xuất hiện khi nhấp vào phương pháp Trừ. Nhập các số nguyên, nhấp vào nút Gọi và nhận kết quả như được hiển thị ở đây -

Trang sau xuất hiện khi nhấp vào phương pháp Multiply. Nhập các số nguyên, nhấp vào nút Gọi và nhận kết quả như được hiển thị ở đây -

Trang sau xuất hiện khi nhấp vào phương pháp Chia. Nhập các số nguyên, nhấp vào nút Gọi và nhận kết quả như được hiển thị ở đây -

Sau khi dịch vụ được gọi, bạn có thể chuyển đổi giữa chúng trực tiếp từ đây.

Sau khi tạo một dịch vụ WCF, bước tiếp theo là lưu trữ nó để các ứng dụng khách có thể sử dụng nó. Đây được gọi là dịch vụ lưu trữ WCF. Dịch vụ WCF có thể được lưu trữ bằng cách sử dụng bất kỳ cách nào trong số bốn cách được đưa ra dưới đây:

  • IIS Hosting- IIS là viết tắt của Internet Information Services. Mô hình hoạt động của nó tương tự như ASP.NET khi lưu trữ dịch vụ WCF. Tính năng tốt nhất của lưu trữ IIS là việc kích hoạt dịch vụ được xử lý tự động. Lưu trữ IIS cũng cung cấp theo dõi tình trạng quy trình, tắt máy khi không hoạt động, tái chế quy trình và nhiều tính năng khác để hỗ trợ lưu trữ dịch vụ WCF.

  • Self-Hosting- Khi một dịch vụ WCF được lưu trữ trong một ứng dụng được quản lý, nó được gọi là tự lưu trữ. Nó yêu cầu nhà phát triển viết mã cần thiết để khởi tạo ServiceHost. Trong tự lưu trữ, một dịch vụ WCF có thể được lưu trữ trong nhiều ứng dụng khác nhau như ứng dụng Console, biểu mẫu Windows, v.v.

  • WAS Hosting - Lưu trữ dịch vụ WCF trong Windows Activation Service (WAS) là thuận lợi nhất vì các tính năng của nó như tái chế quy trình, quản lý thời gian nhàn rỗi, hệ thống cấu hình chung và hỗ trợ HTTP, TCP, v.v.

  • Windows Service Hosting- Đối với các máy khách hệ thống cục bộ, tốt nhất nên lưu trữ dịch vụ WCF dưới dạng dịch vụ cửa sổ và dịch vụ này được gọi là Dịch vụ lưu trữ cửa sổ. Tất cả các phiên bản Windows đều hỗ trợ loại lưu trữ này và tại đây, Service Control Manager có thể kiểm soát vòng đời quy trình của dịch vụ WCF.

Lưu trữ một dịch vụ WCF trong IIS (Dịch vụ Thông tin Internet) là một quá trình từng bước. IIS Hosting được minh họa chi tiết bên dưới với mã hóa mong muốn cũng như ảnh chụp màn hình để hiểu quy trình.

Step 1- Khởi động Visual Studio 2012 và nhấp vào Tệp → Mới → Trang web. Chọn “Dịch vụ WCF” và Vị trí là http. Điều này sẽ lưu trữ dịch vụ trong IIS. Bấm OK.

Step 2 - Đoạn mã đằng sau giao diện được đưa ra bên dưới.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

// NOTE: You can use the "Rename" command on the "Refactor" menu to 
// change the interface name "IService" in both code and config file 
// together.

[ServiceContract]
Public interface IService {
   [OperationContract]
   String GetData(int value);

   [OperationContract]
   CompositeType GetDataUsingDataContract(CompositeType composite);

   // TODO: Add your service operations here
}

// Use a data contract as illustrated in the sample below to add 
// composite types to service operations.

[DataContract]
Public class CompositeType {
   Bool boolValue = true;
   String stringValue = "Hello ";

   [DataMember]
   Public bool BoolValue {
      get { return boolValue; }
      set { boolValue = value; }
   }

   [DataMember]
   Public string StringValue {
      get { return stringValue; }
      set { stringValue = value; }
   }
}

Step 3 - Đoạn mã đằng sau tệp lớp được đưa ra bên dưới.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

// NOTE: You can use the "Rename" command on the "Refactor" menu to 
// change the class name "Service" in code, svc and config file 
// together.

Public class Service : IService {
   Public string GetData(int value) {
      Return string.Format("You entered: {0}", value);
   }

   Public CompositeType GetDataUsingDataContract(CompositeType composite) {
      if(composite == null) {
         thrownewArgumentNullException("composite");
      }
      
      if(composite.BoolValue) {
         composite.StringValue += "Suffix";
      }
      return composite;
   }
}

Step 4- Tệp dịch vụ (.svc) chứa tên của dịch vụ và mã đằng sau tên tệp. Tập tin này được sử dụng để biết về dịch vụ.

<%@ ServiceHost Language = "C#" Debug = "true" Service = "Service" 
   CodeBehind = "~/App_Code/Service.cs" %>

Step 5- Cấu hình phía máy chủ được đề cập trong tệp cấu hình. Ở đây, chỉ đề cập đến một điểm cuối được định cấu hình thành 'wsHttpBinding'; chúng ta cũng có thể có nhiều điểm cuối với các ràng buộc khác nhau. Vì chúng tôi sẽ lưu trữ trong IIS, chúng tôi chỉ sử dụng liên kết http.

<?xml version = "1.0"?>
<configuration>
   <!-- 
      Note: As an alternative to hand editing this file you can use the 
         web admin tool to configure settings for your application. Use
         the Website->Asp.Net Configuration option in Visual Studio.
         A full list of settings and comments can be found in 
         machine.config.comments usually located in 
         \Windows\Microsoft.Net\Framework\vx.x\Config 
   -->
   <configSections>
      <sectionGroup name = "system.web.extensions"  
         ype = "System.Web.Configuration.SystemWebExtensionsSectionGroup, 
         System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
         PublicKeyToken = 31BF3856AD364E35">
      
         <sectionGroup name = "scripting" 
            type = "System.Web.Configuration.ScriptingSectionGroup, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,     
            PublicKeyToken = 31BF3856AD364E35">
      
            <section name = "scriptResourceHandler" 
               type = "System.Web.Configuration.ScriptingScriptResourceHandlerSection, 
               System.Web.Extensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35" 
               requirePermission = "false" 
               allowDefinition = "MachineToApplication"/>
      
            <sectionGroup name = "webServices" 
               type = "System.Web.Configuration.ScriptingWebServicesSectionGroup, 
               System.Web.Extensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35">
   
               <section name = "jsonSerialization" 
                  type = "System.Web.Configuration.ScriptingJsonSerializationSection, 
                  System.Web.Extensions, Version = 3.5.0.0, 
                  Culture = neutral, PublicKeyToken = 31BF3856AD364E35" 
                  requirePermission = "false" allowDefinition = "Everywhere"/>

               <section name = "profileService" 
                  type = "System.Web.Configuration.ScriptingProfileServiceSection, 
                  System.Web.Extensions, Version = 3.5.0.0, 
                  Culture = neutral, PublicKeyToken = 31BF3856AD364E35" 
                  requirePermission = "false" 
                  allowDefinition = "MachineToApplication"/>

               <section name = "authenticationService" 
                  type = "System.Web.Configuration.ScriptingAuthenticationServiceSection, 
                  System.Web.Extensions, Version = 3.5.0.0, 
                  Culture = neutral, PublicKeyToken = 31BF3856AD364E35" 
                  requirePermission = "false" 
                  allowDefinition = "MachineToApplication"/>

               <section name = "roleService" 
                  type = "System.Web.Configuration.ScriptingRoleServiceSection, 
                  System.Web.Extensions, Version = 3.5.0.0, 
                  Culture = neutral, PublicKeyToken = 31BF3856AD364E35" 
                  requirePermission = "false" 
                  allowDefinition = "MachineToApplication"/>
      
            </sectionGroup>
         </sectionGroup>
      </sectionGroup>
   </configSections>
   
<appSettings/>
   <connectionStrings/>
   <system.web>
      <!-- 
         Set compilation debug="true" to insert debugging 
         symbols into the compiled page. Because this 
         affects performance, set this value to true only 
         during development.
      -->
      
      <compilation debug = "true">
         <assemblies> 
         
            <add assembly = "System.Core, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = B77A5C561934E089"/>
            
            <add assembly = "System.Web.Extensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>
            
            <add assembly = "System.Data.DataSetExtensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = B77A5C561934E089"/>
            
            <add assembly = "System.Web.Extensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>
            
            <add assembly = "System.Xml.Linq, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = B77A5C561934E089"/>
            
         </assemblies>
      </compilation>
      
         <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
         -->
         
      <authentication mode="Windows"/>
         <!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.

            <customErrors mode = "RemoteOnly" defaultRedirect = "GenericErrorPage.htm">
               <error statusCode = "403" redirect = "NoAccess.htm" />
               <error statusCode = "404" redirect = "FileNotFound.htm" />
            </customErrors>
         -->
         
         <pages>
            <controls>
               <add tagPrefix = "asp" namespace = "System.Web.UI" 
                  assembly = "System.Web.Extensions, Version = 3.5.0.0, 
                  Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>
               
               <add tagPrefix = "asp" namespace = "System.Web.UI.WebControls" 
                  assembly = "System.Web.Extensions, Version = 3.5.0.0, 
                  Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>
               
            </controls>
         </pages>
         
         <httpHandlers>
            <remove verb = "*" path = "*.asmx"/>
            
            <add verb = "*" path = "*.asmx" validate = "false" 
               type = "System.Web.Script.Services.ScriptHandlerFactory, 
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35"/>
            
            <add verb = "*" path = "*_AppService.axd" validate = "false" 
               type = "System.Web.Script.Services.ScriptHandlerFactory, 
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral,
               PublicKeyToken = 31BF3856AD364E35"/>
            
            <add verb = "GET,HEAD" path = "ScriptResource.axd" 
               type = "System.Web.Handlers.ScriptResourceHandler, 
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35" validate = "false"/>
         </httpHandlers>
         
         <httpModules>
            <add name = "ScriptModule" 
               type = "System.Web.Handlers.ScriptModule, 
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35"/>
         </httpModules>
   </system.web>
   
   <system.codedom>
      <compilers>
      
         <compiler language = "c#;cs;csharp" extension = ".cs" 
            warningLevel = "4" type = "Microsoft.CSharp.CSharpCodeProvider, 
            System, Version = 2.0.0.0, Culture = neutral, 
            PublicKeyToken = b77a5c561934e089">
         
            <providerOption name = "CompilerVersion" value = "v3.5"/>
            <providerOption name = "WarnAsError" value = "false"/>

         </compiler>

         <compiler language = "vb;vbs;visualbasic;vbscript" extension = ".vb" 
            warningLevel = "4" type = "Microsoft.VisualBasic.VBCodeProvider, 
            System, Version = 2.0.0.0, Culture = neutral, 
            PublicKeyToken = b77a5c561934e089">

            <providerOption name = "CompilerVersion" value = "v3.5"/>
            <providerOption name = "OptionInfer" value = "true"/>
            <providerOption name = "WarnAsError" value = "false"/>
            
         </compiler>
      </compilers>
      
   </system.codedom>
   <!-- 
      The system.webServer section is required for running ASP.NET AJAX 
      under Internet Information Services 7.0.  
      It is not necessary for previous version of IIS.
   -->
   <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      
      <modules>
         <remove name = "ScriptModule"/>
         <add name = "ScriptModule" preCondition = "managedHandler" 
            type = "System.Web.Handlers.ScriptModule, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
      </modules>
      
      <handlers>
         <remove name = "WebServiceHandlerFactory-Integrated"/>
         <remove name = "ScriptHandlerFactory"/>
         <remove name = "ScriptHandlerFactoryAppServices"/>
         <remove name = "ScriptResource"/>
         
         <add name = "ScriptHandlerFactory" verb = "*" path = "*.asmx" 
            preCondition = "integratedMode" 
            type = "System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>    
         
         <add name = "ScriptHandlerFactoryAppServices" 
            verb = "*" path = "*_AppService.axd" preCondition = "integratedMode" 
            type = "System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
         
         <add name = "ScriptResource" preCondition = "integratedMode" 
            verb = "GET,HEAD" path = "ScriptResource.axd" 
            type = "System.Web.Handlers.ScriptResourceHandler, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
      </handlers>
      
      <!--To browse web app root directory during debugging, 
         set the value below to true. Set to false before deployment to 
         avoid disclosing web app folder information.-->
      
      <directoryBrowse enabled = "true"/>
   </system.webServer>
   
   <runtime>
      <assemblyBinding appliesTo = "v2.0.05727" xmlns =" urn:schemas-microsoft-com:asm.v1">
      
         <dependentAssembly>
            <assemblyIdentity name = "System.Web.Extensions" publicKeyToken = "31bf3856ad364e35"/>
            <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/>
         </dependentAssembly>
         
         <dependentAssembly>
            <assemblyIdentity name = "System.Web.Extensions.Design" publicKeyToken =" 31bf3856ad364e35"/>
            <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/>
         </dependentAssembly>
         
      </assemblyBinding>
   </runtime>
   
   <system.serviceModel>
      <services>
         <service name = "Service" behaviorConfiguration = "ServiceBehavior">
         <!-- Service Endpoints -->
            <endpoint address = "" binding = "basicHttpBinding" contract = "IService">
               <!-- 
                  Upon deployment, the following identity element should be removed or replaced 
                  to reflect the identity under which the deployed service runs. If removed, 
                  WCF will infer an appropriate identity automatically.
               -->

               <identity>
                  <dns value="localhost"/>
               </identity>

            </endpoint>
            <endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange"/>
            
         </service>
      </services>
      
      <behaviors> 
         <serviceBehaviors>
            <behavior name = "ServiceBehavior">
               <!-- To avoid disclosing metadata information, set the value below 
                  to false before deployment -->
               
               <serviceMetadata httpGetEnabled = "true"/>
               
               <!-- To receive exception details in faults for debugging purposes, 
                  set the value below to true. 
                  Set to false before deployment to false avoid 
                  disclosing exception information -->
               
               <serviceDebug includeExceptionDetailInFaults = "false"/>
            </behavior>
         </serviceBehaviors>
      </behaviors>
      
   </system.serviceModel>
</configuration>

Step 6- Bạn cần đề cập đến tên tệp dịch vụ, cùng với Địa chỉ được đề cập trong tệp cấu hình. Ảnh chụp màn hình của IIS được đưa ra ở đây.

Nhấp vào Bắt đầu → chạy → inetmgr sẽ mở cửa sổ sau.

Step 7 - Chạy ứng dụng sẽ xuất hiện màn hình sau.

Ở đây, dịch vụ WCF được lưu trữ trong một ứng dụng bảng điều khiển. Dưới đây là quy trình với các bước phù hợp theo trình tự giải thích toàn bộ quy trình.

Step 1- Đầu tiên, chúng ta hãy tạo hợp đồng Dịch vụ và việc thực hiện nó. Tạo một ứng dụng console và đặt tên là MyCalculatorService. Đây là một dịch vụ đơn giản để trả về phép cộng hai số.

Step 2- Bây giờ, nhấp chuột phải vào Tài liệu tham khảo trong Trình khám phá giải pháp và nhấp vào Thêm tài liệu tham khảo. Cửa sổ sau sẽ mở ra; thêm tham chiếu System.ServiceModel vào dự án.

Step 3- Tạo giao diện ISimpleCalculator, Thêm thuộc tính ServiceContract và OperationContract vào lớp và hàm như hình bên dưới. Bạn sẽ biết thêm về các hợp đồng này trong phần sau. Các hợp đồng này sẽ đưa phương pháp ra thế giới bên ngoài để sử dụng dịch vụ này.

Step 4 - Mã đằng sau tệp này như sau:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace MyCalculatorWCFService {
   [ServiceContract()]
   Public interface ISimpleCalculator {
      [OperationContract()]
      int Add(int num1, int num2);
   }
}

Step 5 - MyCalculatorService là lớp thực thi cho giao diện IMyCalculatorService như hình bên dưới.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyCalculatorWCFService {
   Class SimpleCalculator : ISimpleCalculator {
      Public int Add(int num1, int num2) {
         return num1 + num2;
      }
   }
}

Step 6- Bây giờ, chúng tôi đã sẵn sàng với dịch vụ. Hãy bắt đầu thực hiện quy trình lưu trữ. Tạo một ứng dụng console mới và đặt tên là 'MyCalculatorWCFServiceHost'.

Step 7 - Thêm tham chiếu của system.servicemodel và dự án MyCalculatorWCFService.

Mã đằng sau điều này như sau:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyCalculatorWCFService;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace MyCalculatorWCFServiceHost {
   class Program {
      static void Main(string[] args) {
         //Create a URI to serve as the base address
         UrihttpUrl = newUri("http://localhost:8090/MyCalculatorWCFService/SimpleCalculator");
         
         //Create ServiceHost
         ServiceHost host = newServiceHost(typeof(MyCalculatorWCFService.ISimpleCalculator), httpUrl);
         
         //Add a service endpoint
         host.AddServiceEndpoint(typeof(MyCalculatorWCFService.ISimpleCal culator), newWSHttpBinding(), "");
         
         //Enable metadata exchange
         ServiceMetadataBehaviorsmb = newServiceMetadataBehavior();
         smb.HttpGetEnabled = true;
         host.Description.Behaviors.Add(smb);

         //Start the Service
         host.Open();
         Console.WriteLine("Service is host at " + DateTime.Now.ToString());
         Console.WriteLine("Host is running... Press  key to stop");
         Console.ReadLine();
      }
   }
}

Để hiểu khái niệm về lưu trữ WAS, chúng ta cần hiểu cách hệ thống được cấu hình và cách tạo hợp đồng dịch vụ, cho phép các ràng buộc khác nhau đối với dịch vụ được lưu trữ.

Trước hết, hãy bật WCF cho các giao thức không phải là giao thức. Trước khi bắt đầu tạo dịch vụ, chúng ta cần cấu hình hệ thống để hỗ trợ WAS. Sau đây là các bước để định cấu hình WAS -

  • Nhấp vào Menu Bắt đầu → Bảng điều khiển → Chương trình và Tính năng, và nhấp vào "Bật hoặc Tắt các thành phần Windows" trong ngăn bên trái.

  • Mở rộng "Microsoft .Net Framework 3.0" và bật "Kích hoạt HTTP của Windows Communication Foundation" và "Kích hoạt Windows Communication Foundation không phải HTTP".

  • Tiếp theo, chúng ta cần thêm Binding vào trang web mặc định. Ví dụ, chúng tôi sẽ liên kết trang web mặc định với giao thức TCP. Đi tới Menu Bắt đầu → Chương trình → Phụ kiện. Nhấp chuột phải vào "Command Prompt" và chọn "Run as administrator" từ menu ngữ cảnh.

  • Thực hiện lệnh sau:

C:\Windows\system32\inetsrv> appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']

Lệnh này thêm liên kết trang net.tcp vào trang web mặc định bằng cách sửa đổi tệp applicationHost.config nằm trong thư mục "C: \ Windows \ system32 \ inetsrv \ config". Tương tự, chúng ta có thể thêm các giao thức khác nhau vào trang web mặc định.

Tạo dịch vụ được lưu trữ WAS

Step-1 - Mở Visual Studio 2008 và nhấp vào Mới → Trang web và chọn Dịch vụ WCF từ mẫu và Vị trí dưới dạng HTTP, như hình dưới đây -

Step-2- Tạo Hợp đồng bằng cách tạo giao diện IMathService. Thêm thuộc tính ServiceContract vào giao diện và thuộc tính OperationContract vào khai báo phương thức.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

// NOTE: You can use the "Rename" command on the "Refactor" menu to 
// change the interface name "IService" in both code and config file 
// together.

[ServiceContract]

Public interface IMathService {
   [OperationContract]
   int Add(int num1, int num2);

   [OperationContract]
   int Subtract(int num1, int num2);
}

Step-3 - Việc triển khai giao diện IMathService được hiển thị bên dưới -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

// NOTE: You can use the "Rename" command on the "Refactor" menu to 
// change the class name "Service" in code, svc and config file 
// together.

Public class MathService : IMathService {
   Public int Add(int num1, int num2) {
      return num1 + num2;
   }
   Public int Subtract(int num1, int num2) {
      return num1 - num2;
   }
}

Step-4 - Tệp Dịch vụ được hiển thị bên dưới.

<%@ServiceHostLanguage="C#"Debug="true"Service="MathService"CodeBehind="~/App_Code/MathService.cs"%>

Step-5- Trong tệp web.Config, tạo điểm cuối có ràng buộc 'netTcpBinding' và siêu dữ liệu dịch vụ sẽ được xuất bản bằng cách sử dụng điểm Trao đổi siêu dữ liệu. Vì vậy, hãy tạo điểm cuối Metadata Exchange với địa chỉ là 'mex' và ràng buộc là 'mexTcpBinding'. Nếu không xuất bản siêu dữ liệu dịch vụ, chúng tôi không thể tạo proxy bằng địa chỉ net.tcp, ví dụ:

svcutil.exe net.tcp://localhost/WASHostedService/MathService.svc).
<?xml version = "1.0" ?>
<configuration>
   <!--
      Note: As an alternative to hand editing this file you can use the 
         web admin tool to configure settings for your application. Use
         the Website->Asp.Net Configuration option in Visual Studio.
         A full list of settings and comments can be found in 
         machine.config.comments usually located in 
         \Windows\Microsoft.Net\Framework\vx.x\Config 
   -->
   <configSections>
      <sectionGroup name = "system.web.extensions" 
         type = "System.Web.Configuration.SystemWebExtensionsSectionGroup, 
         System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
         PublicKeyToken = 31BF3856AD364E35">
		
         <sectionGroup name = "scripting" 
            type = "System.Web.Configuration.ScriptingSectionGroup, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken =3 1BF3856AD364E35">

            <section name = "scriptResourceHandler" 
               type = "System.Web.Configuration.ScriptingScriptResourceHandlerSection, 
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35" 
               requirePermission = "false" 
               allowDefinition = "MachineToApplication"/>

            <sectionGroup name = "webServices" 
               type = "System.Web.Configuration.ScriptingWebServicesSectionGroup, 
               System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35">

               <section name = "jsonSerialization" 
                  type = "System.Web.Configuration.ScriptingJsonSerializationSection, 
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" 
                  allowDefinition = "Everywhere"/>

               <section name = "profileService" 		     
                  type = "System.Web.Configuration.ScriptingProfileServiceSection, 
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" 
                  allowDefinition = "MachineToApplication"/>

               <section name = "authenticationService" 			     
                  type = "System.Web.Configuration.ScriptingAuthenticationServiceSection, 
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false" 
                  allowDefinition = "MachineToApplication"/>

               <section name = "roleService"	
                  type = "System.Web.Configuration.ScriptingRoleServiceSection, 
                  System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
                  PublicKeyToken = 31BF3856AD364E35" requirePermission = "false"
                  allowDefinition = "MachineToApplication"/>

            </sectionGroup>
         </sectionGroup>
      </sectionGroup>
   </configSections>
   
   <appSettings/>
   <connectionStrings/>
   
   <system.web>
      <!--
         Set compilation debug="true" to insert debugging 
         symbols into the compiled page. Because this 
         affects performance, set this value to true only 
         during development.
      -->
      <compilation debug = "true">
         <assemblies>
            <add assembly = "System.Core, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = B77A5C561934E089"/>
            
            <add assembly = "System.Web.Extensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>
            
            <add assembly = "System.Data.DataSetExtensions, 
               Version = 3.5.0.0, Culture = neutral,                  
               PublicKeyToken = B77A5C561934E089"/>
            
            <add assembly = "System.Web.Extensions, Version = 3.5.0.0, 
               Culture = neutral, PublicKeyToken = 31BF3856AD364E35"/>
            
            <add assembly = "System.Xml.Linq, 
               Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = B77A5C561934E089"/>
         </assemblies>
      </compilation>
      
      <!--
         The <authentication> section enables configuration          
         of the security authentication mode used by 
         ASP.NET to identify an incoming user. 
      -->
      
      <authentication mode="Windows"/>
      
      <!--
         The <customErrors> section enables configuration 
         of what to do if/when an unhandled error occurs 
         during the execution of a request. Specifically, 
         it enables developers to configure html error pages 
         to be displayed in place of a error stack trace.
         <customErrors mode = "RemoteOnly" defaultRedirect = "GenericErrorPage.htm">
         <error statusCode = "403" redirect = "NoAccess.htm" />
         <error statusCode = "404" redirect = "FileNotFound.htm" />
         </customErrors>
      -->
      
      <pages>
         <controls>
            <add tagPrefix = "asp" namespace = "System.Web.UI" 
               assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35"/>
            
            <add tagPrefix = "asp" namespace = "System.Web.UI.WebControls"
               assembly = "System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
               PublicKeyToken = 31BF3856AD364E35"/>
         </controls>
      </pages>
      
      <httpHandlers>
         <remove verb = "*" path = "*.asmx"/>
         
         <add verb =" *" path =" *.asmx" validate="false"         
            type = "System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
         
         <add verb = "*" path = "*_AppService.axd" validate = "false" 
            type = "System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions, 
            Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
         
         <add verb = "GET,HEAD" path = "ScriptResource.axd"        
            type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, 
            Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35" validate = "false"/>
      </httpHandlers>
      
      <httpModules>
         <add name = "ScriptModule" 
            type = "System.Web.Handlers.ScriptModule, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
      </httpModules>
      
   </system.web>
   
   <system.codedom>
      <compilers>
         
         <compiler language = "c#;cs;csharp" extension = ".cs" warningLevel = "4" 
            type = "Microsoft.CSharp.CSharpCodeProvider, System, 
            Version = 2.0.0.0, Culture = neutral,                 
            PublicKeyToken = b77a5c561934e089">
         
            <providerOption name = "CompilerVersion" value = "v3.5"/>
            <providerOption name = "WarnAsError" value = "false"/>
         </compiler>
         
         <compiler language = "vb;vbs;visualbasic;vbscript" 
            extension = ".vb" warningLevel = "4" 
            type = "Microsoft.VisualBasic.VBCodeProvider, System, 
            Version = 2.0.0.0, Culture = neutral,                  
            PublicKeyToken = b77a5c561934e089">
         
            <providerOption name = "CompilerVersion" value = "v3.5"/>
            <providerOption name = "OptionInfer" value = "true"/>
            <providerOption name = "WarnAsError" value = "false"/>
         </compiler>
      
      </compilers>
   </system.codedom>
   
   <!--
      The system.webServer section is required for running ASP.NET AJAX under 
      Internet Information Services 7.0. It is not necessary for previous version of IIS.
   -->
   
   <system.webServer>
      <validation validateIntegratedModeConfiguration = "false"/>
      
      <modules>
         <remove name = "ScriptModule"/>
         <add name = "ScriptModule" preCondition = "managedHandler"         
            type = "System.Web.Handlers.ScriptModule, System.Web.Extensions, 
            Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
      </modules>
      
      <handlers>
         <remove name = "WebServiceHandlerFactory-Integrated"/>
         <remove name = "ScriptHandlerFactory"/>
         <remove name = "ScriptHandlerFactoryAppServices"/>
         <remove name = "ScriptResource"/>
         
         <add name = "ScriptHandlerFactory" 
            verb = "*" path = "*.asmx" preCondition = "integratedMode"              
            type = "System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
         
         <add name = "ScriptHandlerFactoryAppServices" 
            verb = "*" path = "*_AppService.axd" preCondition = "integratedMode" 
            type = "System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
         
         <add name = "ScriptResource" preCondition = "integratedMode" 
            verb = "GET,HEAD" path = "ScriptResource.axd" 
            type = "System.Web.Handlers.ScriptResourceHandler, 
            System.Web.Extensions, Version = 3.5.0.0, Culture = neutral, 
            PublicKeyToken = 31BF3856AD364E35"/>
         
      </handlers>
      <!--
         To browse web app root directory during debugging, set the value below to true. 
         Set to false before deployment to avoid disclosing web app folder information.
      -->
      <directoryBrowse enabled="true"/>
   </system.webServer>
   
   <runtime>
      <assemblyBinding appliesTo = "v2.0.05727" xmlns = "urn:schemas-microsoft-com:asm.v1">
      
         <dependentAssembly>
            <assemblyIdentity name = "System.Web.Extensions" publicKeyToken = "31bf3856ad364e35"/>
            <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/>
         </dependentAssembly>
         
         <dependentAssembly>
            <assemblyIdentity name = "System.Web.Extensions.Design" publicKeyToken = "31bf3856ad364e35"/>
            <bindingRedirect oldVersion = "1.0.0.0-1.1.0.0" newVersion = "3.5.0.0"/>
         </dependentAssembly>
         
      </assemblyBinding>
   </runtime>
   
   <system.serviceModel>
      <services>
         <service behaviorConfiguration = "ServiceBehavior" name = "Service">
            <endpoint address = "" binding = "basicHttpBinding" contract = "IMathService">
            
            <identity>
               <dns value = "localhost" />
            </identity>
            
            </endpoint>
            <endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange"/>
         </service>
      </services>
      
      <behaviors>
         <serviceBehaviors>
            <behavior name = "ServiceBehavior">
               <!-- 
                  To avoid disclosing metadata information, set the value below 
                  to false before deployment. 
               -->
               <serviceMetadata httpGetEnabled="true"/>
               
               <!-- 
                  To receive exception details in faults for debugging purposes, 
                  set the value below to true. Set to false before deployment to avoid 
                  disclosing exception information 
               -->
               <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
         </serviceBehaviors>
      </behaviors>
      
   </system.serviceModel>
</configuration>

Bật các ràng buộc khác nhau với dịch vụ được lưu trữ

  • Đi tới menu Bắt đầu → Chương trình → Phụ kiện. Nhấp chuột phải vào "Command Prompt" và chọn "Run as administrator" từ menu ngữ cảnh.

  • Thực hiện lệnh sau:

C:\Windows\system32\inetsrv>appcmd set app "Default Web Site/WASHostedService" /enabledProtocols:http,net.tcp

Nó sẽ tạo ra kết quả sau:

Hoạt động của dịch vụ lưu trữ Windows là một hoạt động đơn giản. Dưới đây là các bước với mã hóa và ảnh chụp màn hình cần thiết giải thích quy trình một cách dễ dàng.

Step 1- Bây giờ chúng ta hãy tạo một dịch vụ WCF. Mở Visual Studio 2008 và nhấp vào Mới → Dự án và chọn Thư viện lớp từ mẫu.

Step 2- Thêm tham chiếu System.ServiceModel vào dự án. Đây là tập hợp cốt lõi được sử dụng để tạo dịch vụ WCF.

Step 3- Tiếp theo, chúng ta có thể tạo giao diện ISimpleCalulator. Thêm thuộc tính Hợp đồng Dịch vụ và Vận hành như hình dưới đây -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace WindowsServiceHostedService{
   [ServiceContract]
   public interfaceISimpleCalculator {
      [OperationContract]
      int Add(int num1, int num2);

      [OperationContract]
      int Subtract(int num1, int num2);

      [OperationContract]
      int Multiply(int num1, int num2);

      [OperationContract]
      double Divide(int num1, int num2);
   }
}

Step 4 - Triển khai giao diện ISimpleCalculator như hình dưới đây -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsServiceHostedService {
   Class SimpleCalulator : ISimpleCalculator {
      Public int Add(int num1, int num2) {
         return num1 + num2;
      }
      Public int Subtract(int num1, int num2) {
         return num1 - num2;
      }
      Public int Multiply(int num1, int num2) {
         return num1 * num2;
      }
      Public double Divide(int num1, int num2) {
         if (num2 != 0)
            return num1 / num2;
         else
            return 0;
      }
   }
}

Step 5- Xây dựng Dự án và lấy dll. Bây giờ, chúng tôi đã sẵn sàng với dịch vụ WCF. Chúng ta sẽ xem cách lưu trữ dịch vụ WCF trong dịch vụ Windows.

Note- Trong dự án này, có đề cập đến việc chúng tôi đang tạo cả Hợp đồng và Dịch vụ (thực hiện) trong cùng một dự án. Tuy nhiên, nó luôn là một thực tiễn tốt nếu bạn có cả hai trong các dự án khác nhau.

Step 6 - Mở Visual Studio 2008 và nhấp vào New → Project và chọn Windows Service.

Step 7- Thêm 'WindowsServiceHostedService.dll' làm tham chiếu đến dự án. Lắp ráp này sẽ hoạt động như một dịch vụ.

Step 8- Phương thức OnStart của dịch vụ có thể được sử dụng để viết mã lưu trữ cho WCF. Chúng tôi phải đảm bảo rằng chúng tôi đang sử dụng duy nhất một đối tượng máy chủ dịch vụ. Phương pháp OnStop được sử dụng để đóng Máy chủ dịch vụ. Đoạn mã sau đây cho thấy cách lưu trữ dịch vụ WCF trong dịch vụ Windows.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCFHostedWindowsService {
   Partial class WCFHostedWindowsService : ServiceBase {
      ServiceHostm_Host;

      Public WCFHostedWindowsService() {
         InitializeComponent();
      }
      Private void InitializeComponent() {
         thrownewNotImplementedException();
      }
      protectedoverridevoidOnStart(string[] args) {
         if (m_Host != null) {
            m_Host.Close();
         }
        
         //Create a URI to serve as the base address
         UrihttpUrl = newUri("http://localhost:8090/WindowsServiceHostedService/SimpleCalculator");
        
         //Create ServiceHost
         m_Host = newServiceHost typeof(WindowsServiceHostedService.SimpleCalulator), httpUrl);
        
         //Add a service endpoint
         m_Host.AddServiceEndpoint (typeof(WindowsServiceHostedService.ISimpleCalculator), newWSHttpBinding(), "");
        
         //Enable metadata exchange
         ServiceMetadataBehaviorsmb = newServiceMetadataBehavior();
         smb.HttpGetEnabled = true;
         m_Host.Description.Behaviors.Add(smb);
        
         //Start the Service
         m_Host.Open();
      }
      protectedoverridevoidOnStop() {
         if (m_Host != null) {
            m_Host.Close();
            m_Host = null;
         }
      }
      staticvoid Main() {
         ServiceBase[] ServicesToRun;
         ServicesToRun = newServiceBase[] { 
            newWCFHostedWindowsService();
         }   
         ServiceBase.Run(ServicesToRun);
      }
   }
}

Step 9- Để cài đặt dịch vụ, chúng ta cần có lớp Installer cho dịch vụ Windows. Vì vậy, hãy thêm một lớp Trình cài đặt mới vào dự án, lớp này được kế thừa từ lớp Trình cài đặt. Dưới đây là mã hiển thị tên dịch vụ, loại StartUp, v.v. của dịch vụ.

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceProcess;
using System.Configuration.Install;
using System.ComponentModel;
using System.Configuration;

namespace WCFHostedWindowsService {
   [RunInstaller(true)]
   Public class WinServiceInstaller : Installer {
      Private ServiceProcessInstaller process;
      Private ServiceInstaller service;

      Public WinServiceInstaller() {
         process = newServiceProcessInstaller();
         process.Account = ServiceAccount.NetworkService;
         service = newServiceInstaller();
         
         service.ServiceName = "WCFHostedWindowsService";
         service.DisplayName = "WCFHostedWindowsService";
         service.Description = "WCF Service Hosted";
         service.StartType = ServiceStartMode.Automatic;
         
         Installers.Add(process);
         Installers.Add(service);
      }
   }
}

Step 10- Xây dựng dự án để lấy file thực thi WCFHostedWindowsService.exe. Tiếp theo, chúng ta cần cài đặt dịch vụ bằng Visual Studio Command Prompt. Vì vậy, hãy mở dấu nhắc lệnh bằng cách nhấp vào Bắt đầu → Tất cả chương trình → Microsoft Visual Studio 2008 → Công cụ Visual Studio → Dấu nhắc lệnh Visual Studio. Sử dụng ứng dụng tiện ích cài đặt, bạn có thể cài đặt dịch vụ như hình dưới đây.

Các dịch vụ WCF cho phép các ứng dụng khác truy cập hoặc sử dụng chúng. Một dịch vụ WCF có thể được sử dụng theo nhiều cách tùy thuộc vào loại máy chủ. Ở đây, chúng tôi đang giải thích phương pháp từng bước để sử dụng dịch vụ WCF cho từng tùy chọn lưu trữ phổ biến sau:

  • Sử dụng Dịch vụ WCF được lưu trữ trong IIS 5/6
  • Sử dụng Dịch vụ WCF tự lưu trữ
  • Sử dụng Dịch vụ WCF được lưu trữ trong Dịch vụ Kích hoạt Windows
  • Sử dụng Dịch vụ WCF được lưu trữ trong Dịch vụ Windows

Sử dụng dịch vụ WCF được lưu trữ trong IIS 5/6

Quy trình sử dụng dịch vụ WCF được lưu trữ trong IIS 5/6 được thảo luận chi tiết dưới đây. Ngoài ra, cuộc thảo luận bao gồm cách tạo các ứng dụng proxy và console.

Step 1- Khi một dịch vụ được lưu trữ trong IIS, chúng ta phải sử dụng dịch vụ đó trong các ứng dụng khách. Trước khi tạo ứng dụng khách, chúng ta cần tạo proxy cho dịch vụ. Proxy này được ứng dụng khách sử dụng để tương tác với dịch vụ. Để tạo proxy, hãy chạy dấu nhắc lệnh Visual Studio 2008. Sử dụng tiện ích dịch vụ, chúng ta có thể tạo lớp proxy và thông tin cấu hình của nó.

svcutilhttp: //localhost/IISHostedService/Service.svc

Sau khi thực hiện lệnh này, chúng ta sẽ nhận được hai tệp được tạo ở vị trí mặc định.

  • MyService.cs - Lớp proxy cho dịch vụ WCF

  • output.config - Thông tin cấu hình về dịch vụ

Step 2 - Bây giờ, chúng ta sẽ bắt đầu tạo ứng dụng Console bằng Visual Studio 2008 (Ứng dụng khách).

Step 3- Thêm tham chiếu 'System.ServiceModel'; đây là dll cốt lõi cho WCF.

Step 4 - Tạo một lớp Proxy.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyServiceClient {
   Class Program {
      Static void Main(string[] args) {
         // Creating Proxy for the MyService
         ServiceClient Client = newServiceClient();
         Console.WriteLine("Client calling the service...");
         Console.WriteLine("Hello Ram");
         Console.Read();
      }
   }
}

Kết quả xuất hiện như sau:

Sử dụng dịch vụ WCF tự lưu trữ

Ở đây, toàn bộ quá trình sử dụng Dịch vụ WCF tự lưu trữ được giải thích từng bước cùng với mã hóa phong phú và ảnh chụp màn hình bất cứ khi nào cần thiết.

Step 1- Dịch vụ được lưu trữ trên máy chủ, bây giờ chúng ta cần triển khai lớp proxy cho máy khách. Có nhiều cách khác nhau để tạo proxy.

  • Sử dụng SvcUtil.exe, chúng ta có thể tạo lớp proxy và tệp cấu hình của nó với các điểm cuối.

  • Thêm tham chiếu Dịch vụ vào ứng dụng khách.

  • Triển khai lớp ClientBase <T>

Trong ba phương pháp này, thực hiện ClientBase <T> là phương pháp tốt nhất. Nếu bạn đang sử dụng hai phương pháp còn lại, chúng tôi cần tạo một lớp proxy mỗi khi thực hiện bất kỳ thay đổi nào trong việc triển khai Dịch vụ. Nhưng đây không phải là trường hợp của ClientBase <T>. Nó sẽ chỉ tạo proxy trong thời gian chạy và vì vậy nó sẽ xử lý mọi thứ.

Với mục đích này, hãy tạo một lớp proxy, bao gồm các tham chiếu của System.ServiceModel và MyCalculatorService.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using MyCalculatorService;

namespace MyCalculatorServiceProxy {
   // WCF create proxy for ISimpleCalculator using ClientBase
   Public class MyCalculatorServiceProxy : 
   ClientBase<ISimpleCalculator>,
   
   ISimpleCalculator {
      Public int Add(int num1, int num2) {
         //Call base to do funtion
         returnbase.Channel.Add(num1, num2);
      }
   }
}

Bây giờ, hãy tạo một ứng dụng bảng điều khiển, bao gồm các tham chiếu của System.ServiceModel và MyCalculatorServiceProxy.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using MyCalculatorServiceProxy;

namespace MyCalculatorServiceClient {
   classProgram {
      Static void Main(string[] args) {
         MyCalculatorServiceProxy.MyCalculatorServiceProxy proxy = newMyCalculatorServiceProxy.MyCalculatorServiceProxy();
         
         Console.WriteLine("Client is running at " + DateTime.Now.ToString());
         Console.WriteLine("Sum of two numbers. 5 + 5 =" + proxy.Add(5,5));
         Console.ReadLine();
      }
   }
}

Step 2 - Thông tin điểm cuối (giống như dịch vụ) nên được thêm vào tệp cấu hình của ứng dụng khách.

<?xmlversion = "1.0"encoding = "utf-8" ?>
<configuration>
   <system.serviceModel>
      <client>
         <endpoint address 
            ="http://localhost:8090/MyCalculatorServiceProxy/ISimpleCalculator"
            binding = "wsHttpBinding" contract "MyCalculatorServiceProxy.ISimpleCalculator">
            </endpoint>
      </client>
   </system.serviceModel>
</configuration>

Step 3- Trước khi chạy ứng dụng khách, bạn cần chạy dịch vụ. Dưới đây là đầu ra của ứng dụng khách.

Sử dụng dịch vụ WCF được lưu trữ trong WAS

Sử dụng dịch vụ WCF được lưu trữ trong WAS là một quá trình đơn giản chỉ bao gồm một vài bước. Các bước như sau:

  • Thêm lớp proxy và tệp cấu hình vào ứng dụng khách.
  • Tạo đối tượng cho MathServiceClient và gọi phương thức.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespaceWASHostedClient {
   classProgram {
      staticvoid Main(string[] args) {
         MathServiceClient client = newMathServiceClient();
         Console.WriteLine("Sum of two number 5,6");
         Console.WriteLine(client.Add(5, 6));
         Console.ReadLine();
      }
   }
}

Kết quả xuất hiện như hình dưới đây.

Sử dụng dịch vụ WCF được lưu trữ trong dịch vụ Windows

Quy trình từng bước về cách sử dụng dịch vụ WCF được lưu trữ trong Windows Service được trình bày chi tiết bên dưới với mã hóa và hướng dẫn.

Khi nó được lưu trữ thành công, chúng tôi có thể tạo một lớp proxy cho dịch vụ và bắt đầu sử dụng trong ứng dụng khách. Ở đây, nó được hiển thị với loại lưu trữ IIS đang tiêu thụ.

Thêm tham chiếu của ServiceModel.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespaceWindowServiceClient {
   classProgram {
      staticvoid Main(string[] args) {
         //Creating Proxy for the MyService
         MyServiceClient client = newMyServiceClient();
         Console.WriteLine("Client calling the service...");
         Console.WriteLine("Sum of two numbers 5,6");
         Console.WriteLine(client.Add(5, 6));
        
         Console.WriteLine("Subtraction of two numbers 6,5");
         Console.WriteLine(client.Sub(6, 5));
        
         Console.WriteLine("Multiplication of two numbers 6,5");
         Console.WriteLine(client.Mul(6, 5));
        
         Console.WriteLine("Division of two numbers 6,3");
         Console.WriteLine(client.Div(6, 3));
         Console.Read();
      }
   }
}

Kết quả xuất hiện như sau:

Ràng buộc dịch vụ WCF là một tập hợp nhiều phần tử, trong đó mỗi phần tử xác định cách dịch vụ giao tiếp với máy khách. Phần tử truyền tải và phần tử mã hóa thông điệp là hai thành phần quan trọng nhất của mỗi ràng buộc. Trong chương này, chúng ta sẽ thảo luận về các ràng buộc dịch vụ WCF khác nhau thường được sử dụng.

Ràng buộc cơ bản

Liên kết cơ bản được cung cấp bởi lớp BasicHttpBinding. Nó sử dụng giao thức HTTP để vận chuyển và đại diện cho một dịch vụ WCF như một dịch vụ web ASP.NET (dịch vụ web ASMX), để các khách hàng cũ sử dụng dịch vụ web ASMX có thể sử dụng các dịch vụ mới một cách thuận tiện.

Liên kết cơ bản được đặt làm ràng buộc mặc định trong dịch vụ web WCF được Silverlight kích hoạt và là ràng buộc tiêu chuẩn cho các giao tiếp theo kiểu dịch vụ web. Nó không hỗ trợ nhắn tin đáng tin cậy.

Dưới đây là đoạn mã mô tả cài đặt mặc định cho liên kết cơ bản.

<basicHttpBinding>
   <binding name = "basicHttpBindingDefaults" allowCookies = "false" 
      bypassProxyOnLocal = "false" hostNameComparisonMode = "StrongWildcard" 
      maxBufferPoolSize = "524288" maxBufferSize = "65536" 
      maxReceivedMessageSize = "65536" messageEncoding = "Text" proxyAddress = "" 
      textEncoding = "utf-8" transferMode = "Buffer" useDefaultWebProxy = "true" 
      closeTimeout = "00:01:00" openTimeout = "00:01:00" receiveTimeout = "00:10:00" 
      sendTimeout = "00:01:00">
   
      <readerQuotas maxArrayLength = "16384" maxBytesPerRead = "4096" 
         maxDepth = "32"
         maxNameTableCharCount = "16384" maxStringContentLength = "8192"/>

      <security mode = "None">
         <transport clientCredentialType = "None" proxyCredentialType = "None" realm = ""/>
         <message algorithmSuite = "Basic256" clientCredentialType = "UserName" />
      </security>       
   </binding>

</basicHttpBinding>

Các cài đặt mặc định ở trên có những hạn chế rõ ràng, vì kích thước tin nhắn bị hạn chế và không có chế độ bảo mật. Tuy nhiên, tùy chỉnh ràng buộc cơ bản giải quyết vấn đề này như bên dưới.

<basicHttpBinding>
   <binding name = "basicHttpSecure" maxBufferSize = "100000" maxReceivedMessageSize = "100000">
   
      <readerQuotas maxArrayLength = "100000" maxStringContentLength = "100000"/>
      <security mode = "TransportWithMessageCredential" />
     
   </binding>
</basicHttpBinding>

Dịch vụ Web ràng buộc

Liên kết Dịch vụ Web (WS) được cung cấp bởi lớp WSHttpBinding. Nó khá giống với ràng buộc cơ bản và sử dụng các giao thức giống nhau để truyền tải, nhưng cung cấp một số thông số kỹ thuật WS– * chẳng hạn như WS – Tin nhắn đáng tin cậy, WS – Giao dịch, WS – Bảo mật, v.v. Tóm lại, WSHttpBinding bằng tổng các thông số kỹ thuật cơ bản củaHttpBinding và WS– *. Dưới đây là đoạn mã mô tả cài đặt mặc định cho WS Binding -

<wsHttpBinding>
   <binding name = "wsHttpBindingDefaults" allowCookies = "false" 
      bypassProxyOnLocal = "false" closeTimeout = "00:01:00" 
      hostNameComparisonMode = "StrongWildcard" 
      maxBufferPoolSize = "524288" maxReceivedMessageSize = "65536" 
      messageEncoding = "Text" openTimeout = "00:01:00" 
      receiveTimeout = "00:10:00" proxyAddress = "" sendTimeout = "00:01:00" 
      textEncoding = "utf-8" transactionFlow = "false" 
      useDefaultWebProxy = "true" > 
   
      <readerQuotas maxArrayLength = "16384" maxBytesPerRead = ."4096" 
         maxDepth = "32" maxNameTableCharCount = "16384" 
         maxStringContentLength = "8192"/>

      <reliableSession enabled = "false" ordered = "true" 
         inactivityTimeout = "oo:10:00" /> 

      <security mode = "Message">
         <message algorithmSuite = "Basic256" clientCredentialType = "Windows" 
            esatalishSecurityContext = "true" 
            negotiateServiceCredential = "true" />

         <transport clientCredentialType = "Windows"
            proxyCredentialType = "None" realm = ""/>        	
      </security>
      
   </binding>
</wsHttpBinding>

Liên kết IPC

Liên kết IPC sử dụng đường ống được đặt tên và được cung cấp bởi lớp netNamedPipeBinding. Đây là ràng buộc nhanh nhất và an toàn nhất trong số tất cả các ràng buộc hiện có. Mặc dù bảo mật cấp độ tin nhắn không được hỗ trợ ở đây, các tin nhắn được bảo mật theo mặc định do bảo mật truyền tải mạnh mẽ. Dưới đây là đoạn mã mô tả cài đặt mặc định cho liên kết IPC -

<netNamedPipeBinding>
   
   <binding name = "netPipeDefaults" closeTimeout = "00:01:00" 
      hostNameComparisonMode = "StrongWildcard" maxBufferPoolSize = "524288" 
      maxBufferSize = "65536" maxConnections = "10" 
      maxReceivedMessageSize = "65536" openTimeout = "00:01:00" 
      receiveTimeout = "00:10:00" sendTimeout = "00:01:00" transactionFlow = "false" 
      transactionProtocol = "OleTransactions" transferMode = "Buffered">  

      <readerQuotas maxArrayLength = "16384" maxBytesPerRead = "4096" 
         maxDepth = "32" maxNameTableCharCount = "16384" 
         maxStringContentLength = "8192"/>
   
      <security mode = "Transport">        	
      </security>
      
   </binding>
</netNamedPipeBinding>

Các loại ràng buộc dịch vụ khác

  • TCP Binding- Được cung cấp bởi lớp NetTCPBinding, ràng buộc này sử dụng giao thức TCP để giao tiếp trong cùng một mạng và mã hóa thông điệp ở định dạng nhị phân. Ràng buộc này được coi là đáng tin cậy nhất so với những ràng buộc khác.

  • WS Dual Binding- Loại ràng buộc này giống WSHttpBinding hơn với ngoại lệ duy nhất là nó tạo điều kiện giao tiếp hai chiều, tức là, các thông điệp có thể được gửi và nhận bởi cả khách hàng và dịch vụ. Nó được cung cấp bởi lớp WSDualHttpBinding.

  • Web binding - Liên kết web được thiết kế để đại diện cho các dịch vụ WCF dưới dạng các yêu cầu HTTP bằng cách sử dụng HTTP-GET, HTTP-POST, v.v. Nó được cung cấp bởi lớp WebHttpBinding và được sử dụng phổ biến với các mạng xã hội.

  • MSMQ Binding- Nó được cung cấp bởi lớp NetMsmqBinding và được sử dụng để cung cấp các giải pháp trong trường hợp dịch vụ xử lý một tin nhắn vào một thời điểm khác với tin nhắn được gửi bởi khách hàng. Liên kết MSMQ sử dụng MSMQ để vận chuyển và cung cấp hỗ trợ cho tin nhắn riêng biệt được xếp hàng đợi. MSMQ là một triển khai cho xếp hàng tin nhắn do Microsoft cung cấp.

  • Federated WS Binding- Đây là một dạng ràng buộc WS cụ thể và cung cấp hỗ trợ cho bảo mật liên hợp. Nó được cung cấp bởi lớp WSFederationHttpBinding.

  • Peer Network Binding- Được cung cấp bởi lớp NetPeerTCPBinding, nó chủ yếu được sử dụng trong các hệ thống chia sẻ tệp. Nó sử dụng giao thức TCP nhưng sử dụng mạng ngang hàng làm phương tiện truyền tải. Trong mạng này, mỗi máy (nút) hoạt động như một máy khách và một máy chủ cho các nút khác. Liên kết mạng ngang hàng được sử dụng trong các hệ thống chia sẻ tệp như torrent.

  • MSMQ Integration Binding - Được cung cấp bởi lớp MsmqIntegrationBinding, nó giúp giao tiếp với các hệ thống hiện có giao tiếp qua MSMQ (Microsoft Message Queuing).

Ngoài ra, bạn cũng có thể tạo các ràng buộc tùy chỉnh. Tuy nhiên, vì có thể điều chỉnh các thuộc tính cấu hình của mỗi ràng buộc WCF, nhu cầu tạo liên kết tùy chỉnh hiếm khi phát sinh.

Tập hợp các kỹ thuật được WCF sử dụng để ràng buộc một tập hợp các thông báo (yêu cầu của khách hàng) với các cá thể dịch vụ được gọi là Quản lý phiên bản. WCF hỗ trợ ba kiểu kích hoạt phiên bản và chúng được thảo luận trong chương này.

Dịch vụ cho mỗi cuộc gọi

Dịch vụ theo cuộc gọi là chế độ kích hoạt phiên bản mặc định của WCF. Khi một dịch vụ WCF được cấu hình cho một dịch vụ mỗi cuộc gọi, một đối tượng CLR sẽ được tạo cho khoảng thời gian mà một cuộc gọi hoặc yêu cầu của khách hàng đang diễn ra. CLR là viết tắt của Common Language Runtime và nó bao gồm các phiên bản dịch vụ trong WCF.

Trong dịch vụ theo cuộc gọi, mọi yêu cầu của khách hàng đều đạt được phiên bản dịch vụ chuyên dụng mới và mức tiêu thụ bộ nhớ của nó ít hơn so với các kiểu kích hoạt phiên bản khác.

Thuộc tính InstanceContextMode bắt buộc phải được đặt thành InstanceContextMode.PerCall, để chỉ ra một dịch vụ WCF hoạt động như một dịch vụ theo cuộc gọi. Thuộc tính InstanceContextMode thuộc thuộc tính ServiceBehavior. Do đó, một dịch vụ cho mỗi cuộc gọi có thể được cấu hình như sau:

[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...}

Một dịch vụ ở đây được biểu thị là IMyContract. Hình sau cho thấy quá trình kích hoạt phiên bản dịch vụ cho mỗi cuộc gọi.

Triển khai dịch vụ cho mỗi cuộc gọi

[DataContract]
class Param {....}

[ServiceContract]
interface IMyContract {
   [OperationContract]
   void MyMethod(Param objectIdentifier);
}
class MyPerCallService : IMyContract, IDisposable {
   public void MyMethod(Param objectIdentifier) {
      GetState(objectIdentifier); 
      DoWork();
      SaveState(objectIdentifier);
   }
   
   void GetState(Param objectIdentifier) {....}
   void DoWork() {....}
   void SaveState(Param objectIdentifier) {....}
   public void Dispose() {....}
}

Ở đây, Param là tham số kiểu giả được phát minh cho ví dụ trên.

Dịch vụ mỗi phiên

Trong chế độ kích hoạt này của WCF, một phiên riêng tư hay có thể nói là một phiên bí mật được duy trì giữa hai thực thể, tức là máy khách và một cá thể dịch vụ cụ thể. Còn được gọi là dịch vụ phiên riêng tư, dịch vụ mỗi phiên cung cấp một phiên bản dịch vụ mới vẫn dành riêng cho từng yêu cầu của khách hàng và tự chủ đối với tất cả các phiên bản khác liên quan đến dịch vụ nhận biết phiên đó.

Để bắt đầu một dịch vụ mỗi phiên, thuộc tính InstanceContextMode được yêu cầu đặt thành PerSession. Tại đây, phiên bản dịch vụ sẽ nằm trong bộ nhớ trong suốt thời lượng phiên.

Chế độ kích hoạt bị ảnh hưởng bởi khả năng mở rộng vì dịch vụ đã định cấu hình không thể hỗ trợ thêm bất kỳ ứng dụng khách nổi bật nào khác ngoài một vài (hoặc có thể lên đến hàng trăm) vì chi phí liên quan đến mỗi phiên bản dịch vụ chuyên dụng này.

Dịch vụ mỗi phiên có thể được định cấu hình như sau:

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}

Quá trình của dịch vụ mỗi phiên có thể được mô tả như trong hình sau:

Đoạn mã sau đây hiển thị hợp đồng và dịch vụ được định cấu hình để sử dụng phiên riêng tư. Kết quả đầu ra chỉ ra rằng máy khách thực sự có một phiên bản dịch vụ chuyên dụng.

Mã dịch vụ

[ServiceContract(Session = true)]
interface IMyContract {
   [OperationContract]
   void MyMethod();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract, IDisposable {
   int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); }
   
   public void MyMethod() {
      m_Counter++;
      Console.WriteLine("Counter = " + m_Counter);
   }
   public void Dispose() { 
      Console.WriteLine("MyService.Dispose()"); 
   }
}

Mã khách hàng

MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); 
proxy.Close();

Đầu ra

MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()

Dịch vụ Singleton

Trong chế độ kích hoạt này của WCF, tất cả các yêu cầu của khách hàng độc lập với nhau đều được kết nối với cùng một phiên bản đơn lẻ nổi tiếng, bất kể kết nối của chúng với các điểm cuối dịch vụ. Dịch vụ singleton chỉ được xử lý khi máy chủ đóng cửa.

Dịch vụ này chỉ được tạo một lần khi máy chủ được tạo. Trong trường hợp, máy chủ không được cung cấp bất kỳ phiên bản singleton nào, dịch vụ sẽ trả về dưới dạng NULL. Chế độ kích hoạt ở mức tốt nhất khi khối lượng công việc trong mỗi lệnh gọi phương thức là ít và không có hoạt động đang chờ xử lý nào ở chế độ nền.

Thuộc tính InstanceContextMode được yêu cầu đặt thành InstanceContextMode.Single để bắt đầu dịch vụ Singleton này.

Do đó, một dịch vụ Singleton có thể được định cấu hình như sau:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}

Quy trình của dịch vụ Singleton được thể hiện trong hình sau:

Đoạn mã sau được sử dụng để khởi tạo và lưu trữ một phiên bản singleton.

Mã dịch vụ

[ServiceContract]
interface IMyContract {
   [OperationContract]
   void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract {
   int m_Counter = 0;
   
   public int Counter {
      get {
         return m_Counter;
      }
      set {
         m_Counter = value;
      }
   }
   public void MyMethod( ) {
      m_Counter++;
      Trace.WriteLine("Counter = " + Counter);
   }
}

Mã máy chủ

MySingleton singleton = new MySingleton( );
singleton.Counter = 42;
ServiceHost host = new ServiceHost(singleton);
host.Open( );

//Do some blocking calls then
host.Close( );

Mã khách hàng

MyContractClient proxy = new MyContractClient( );
proxy.MyMethod( );
proxy.Close( );

Đầu ra

Counter = 43

Giao dịch trong WCF là một tập hợp các hoạt động tuân theo một số thuộc tính, được gọi chung là ACID. Ở đây, nếu một thao tác không thành công, toàn bộ hệ thống sẽ tự động bị lỗi. Khi một đơn đặt hàng được đặt trực tuyến, một giao dịch sẽ diễn ra. Ví dụ sau có thể hữu ích để hiểu quy trình giao dịch theo các thuật ngữ đơn giản hơn.

Thí dụ

Giả sử bạn đã đặt mua một chiếc tivi LCD từ một cửa hàng trực tuyến và bạn sẽ thanh toán số tiền bằng thẻ tín dụng của mình. Khi bạn nhập thông tin cần thiết để đặt hàng, hai thao tác xảy ra đồng thời.

Một, số tiền cụ thể được ghi nợ từ tài khoản ngân hàng của bạn và thứ hai, tài khoản nhà cung cấp được ghi có với số tiền tương tự. Cả hai hoạt động phải thực hiện thành công để có một giao dịch thành công.

Thuộc tính giao dịch WCF

Bốn thuộc tính được theo sau bởi một giao dịch WCF là:

  • Atomic - Tất cả các hoạt động phải hoạt động như một hoạt động duy nhất không thể phân chia khi hoàn thành một giao dịch.

  • Consistency - Dù có thể là tập hợp hoạt động nào, hệ thống luôn ở trạng thái nhất quán, tức là kết quả của giao dịch luôn như mong đợi.

  • Isolation - Trạng thái trung gian của hệ thống không được hiển thị cho bất kỳ thực thể nào của thế giới bên ngoài cho đến khi giao dịch hoàn tất.

  • Durability - Trạng thái cam kết được duy trì bất kể loại lỗi nào (phần cứng, mất điện, v.v.)

Trong khi định cấu hình giao dịch WCF, có một số yếu tố cần được xem xét. Đây là những ràng buộc và hành vi hoạt động.

Binding- Các ràng buộc hỗ trợ giao dịch trong WCF chỉ là một số ít và điều quan trọng là chỉ đưa ra lựa chọn từ những ràng buộc này, những ràng buộc này vẫn bị vô hiệu hóa theo mặc định và nên được kích hoạt để nhận được hỗ trợ cần thiết cho giao dịch. Những ràng buộc này như sau:

  • NetTcpBinding
  • NetNamedPipeBinding
  • WSHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding

Operation behavior- Trong khi một ràng buộc tạo điều kiện thuận lợi cho con đường truyền giao dịch, một hoạt động sẽ xử lý giao dịch cũng như cấu hình hoạt động. Hành vi hoạt động chủ yếu sử dụng hai thuộc tính: TransactionFlow và TransactionScopeRequired. Ở đây, cần lưu ý rằng TransactionFlow chủ yếu có ba giá trị và đó là: Được phép, Bắt buộc và Không được phép.

Đoạn mã sau đây cho thấy việc thay đổi cấu hình của hợp đồng ràng buộc và hoạt động có tạo điều kiện cho việc truyền tải ứng dụng khách hay không.

<bindings> 
   <wsHttpBinding> 
      <binding name = "MandatoryTransBinding" transactionFlow = "true"> 
         <reliableSession enabled ="true"/>
      </binding>
   </wsHttpBinding> 
</bindings>

Giao thức giao dịch

WCF sử dụng ba loại giao thức để giao dịch -

  • Lightweight
  • Giao dịch Ole
  • WS-Giao dịch nguyên tử (WS-AT)

Trong cả ba, WS-AT là một giao thức có thể tương tác và cho phép luồng giao dịch phân tán qua tường lửa. Tuy nhiên, giao thức này không nên được sử dụng khi giao dịch hoàn toàn dựa trên công nghệ của Microsoft.

Các giai đoạn của giao dịch WCF

Có hai giai đoạn trong một giao dịch WCF như thể hiện trong hình sau.

  • Prepare Phase - Trong giai đoạn này, người quản lý giao dịch kiểm tra xem tất cả các thực thể đã sẵn sàng cam kết cho giao dịch hay chưa.

  • Commit Phase - Trong giai đoạn này, cam kết của các thực thể bắt đầu đi vào thực tế.

Hình sau minh họa các chức năng của cả hai giai đoạn của giao dịch WCF.

Kích hoạt giao dịch WCF

Để kích hoạt một giao dịch WCF thành công, người ta cần thực hiện theo một loạt sáu bước một cách tuần tự. Các bước cần thiết được thảo luận dưới đây.

Step 1 − Creation of two WCF Services

Bước quan trọng nhất trong vấn đề này là xây dựng hai dự án dịch vụ trong WCF để tham gia vào một giao dịch duy nhất. Các giao dịch cơ sở dữ liệu sẽ được thực hiện trên cả hai dịch vụ này và sẽ được hiểu rằng cách chúng được thống nhất bởi một giao dịch WCF. Một ứng dụng web của WCFTransactions cũng đã được tạo để sử dụng hai dịch vụ đã tạo trong một phạm vi giao dịch duy nhất.

Step 2 − Method creation and its attribution with TransactionFlow attribute

Tại đây, một phương thức UpdateData sẽ được tạo cho cả hai dịch vụ WCF để chèn vào cơ sở dữ liệu với thuộc tính OperationContract. Để thực hiện nhiệm vụ này, trước tiên một lớp giao diện được tạo với sự trợ giúp của thuộc tính ServiceContract. Đối với việc kích hoạt giao dịch trong phương thức mới được tạo, nó được gán với TransactionFlow và các giao dịch được phép sử dụng là Giá trị được phép.

[ServiceContract]
public interface IService1 {
   [OperationContract]
   [TransactionFlow(TransactionFlowOption.Allowed)]
   void UpdateData();
}

Step 3− Implementation of WCF service with TransactionScopeRequired attribute

Nó được thực hiện bằng cách sử dụng mã hiển thị bên dưới -

[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
   try {
      SqlConnection objConnection = new SqlConnection(strConnection);
      objConnection.Open();
      
      using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
     	   Boolean doRollback = false;
     	   using(SqlCommand cmd = new SqlCommand(
            "insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
         
     	   try {
            cmd.ExecuteNonQuery();
     	   } catch(SqlException) {
            doRollback = true;
            break;
     	   }
      }
      
      if(doRollback)
         transaction.Rollback();
      else
         transaction.Commit();  
   }
   finally {
      objConection.Close();
   }
}

Step 4 − Enabling Transaction Flow by WCF Service Config File

Mã hóa của nó được thực hiện như sau:

<bindings>
   <wsHttpBinding>
      <binding name = "TransactionalBind" transactionFlow = "true"/>
   </wsHttpBinding>
</bindings>

Điều quan trọng là phải gắn ràng buộc giao dịch được phép với điểm cuối để hiển thị dịch vụ WCF.

<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">

Step 5 − Calling both the services in a single transaction

Ở đây, hai dịch vụ trên được gọi trong một giao dịch và cho mục đích này, đối tượng TransactionScope được sử dụng để nhóm cả hai dịch vụ. Phương thức Complete của đối tượng trên được gọi để cam kết một giao dịch WCF. Để khôi phục, phương thức Dispose sẽ được gọi.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
   try {
      // Call your webservice transactions here
      ts.Complete();
   } catch (Exception ex) {
      ts.Dispose();
   }
}

Đoạn mã nhỏ hoàn chỉnh trong đó các giao dịch WCF đã được nhóm lại trong một phạm vi được mô tả bên dưới:

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
   try {
      ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
      obj.UpdateData();
      ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
      obj1.UpdateData();
      ts.Complete();
   } catch (Exception ex) {
      ts.Dispose();
   }
}

Step 6 − Testing WCF transaction

Thử nghiệm được thực hiện ở bước thứ 6 và bước cuối cùng và sau khi gọi dịch vụ WCF đầu tiên, một ngoại lệ sẽ bị bắt buộc.

WCF RIA Service là một khuôn khổ cấp cao hơn và một thành phần mới của các khuôn khổ như .NET 4 và Silverlight 4 giúp giảm bớt quy trình xây dựng một ứng dụng kinh doanh phức tạp trong Silverlight bằng cách cung cấp xác thực phía máy khách. RIA là viết tắt của Rich Internet Applications.

Cần lưu ý ở đây rằng Silverlight là một framework được cung cấp bởi Microsoft, lý tưởng cho các ứng dụng internet phong phú và có sẵn để sử dụng như một plug-in cho trình duyệt, giống như Adobe Flash.

Dịch vụ WCF RIA chủ yếu dựa trên phiên bản tiêu chuẩn của dịch vụ WCF. Hình sau đây minh họa một phần của kiến ​​trúc WCF, nơi mà các dịch vụ WCF RIA nói chung là trọng tâm của nó.

Tạo một Dịch vụ WCF RIA là bước tiếp theo để hiểu rõ hơn về khái niệm này. Quy trình từng bước được đưa ra dưới đây.

Step 1 - Tạo một dự án web mới có tên SLWCFRiaServices.Web bằng cách sử dụng Silverlight 5 và sau đó thêm một mục mới bằng cách chọn ADO.NET Entity Data Model vào cùng.

Step 2 - Bây giờ chọn nội dung mô hình từ Trình hướng dẫn Mô hình Dữ liệu Thực thể bằng cách tạo mô hình từ cơ sở dữ liệu.

Step 3 - Từ cùng một trình hướng dẫn, hãy chọn kết nối dữ liệu và các đối tượng cơ sở dữ liệu của bạn.

Step 4 - Xây dựng giải pháp để trong tương lai, việc nhận dạng mô hình dữ liệu sẽ không phải là vấn đề đối với dịch vụ miền bạn sẽ tạo.

Step 5 - Bây giờ tạo một dịch vụ miền trong dự án web bằng cách thêm một mục mới và đảm bảo cho phép khách hàng truy cập.

Step 6 - Trong bước tiếp theo, một số lớp sẽ được tạo và điều cần thiết là phải xây dựng lại chúng.

Step 7 - Trong bước này, DataDomainContext được hiển thị bởi Data Sources Panel.

Step 8 - Ở bước này, bài viết bên dưới DataDomainContext nên được chọn và tùy chỉnh.

Step 9- Gắn Điều khiển DataGrid với Nguồn Dữ liệu là bước được cam kết ở đây, cùng với việc lựa chọn các chủ đề. Ở đây chủ đề BureauBlue đã được chọn.

Step 10- Bước cuối cùng và bước cuối cùng bao gồm chuyển đến màn hình thiết kế và thêm thực thể vào vùng bố trí của Trang chính bằng cách kéo và thả đơn giản. Điều quan trọng nữa là đảm bảo AutoGenerateColumns = "True" và chạy nó để xem đầu ra.

Điều kiện tiên quyết

Có một số điều kiện tiên quyết để trải nghiệm toàn bộ tiềm năng của các dịch vụ WCF RIA -

  • Visual Studio 2010 / Visual Studio 2012
  • Silverlight Developer Runtime
  • Phiên bản mới nhất của Bộ công cụ dịch vụ RIA
  • SDK (Bộ phát triển phần mềm)

Dịch vụ miền WCF RIA

Dịch vụ miền bao gồm một tập hợp các hoạt động dữ liệu liên quan đến kinh doanh. Nó không là gì khác ngoài một dịch vụ WCF thể hiện bất kỳ logic nghiệp vụ nào của ứng dụng Dịch vụ WCF RIA.

Dịch vụ miền WCF RIA có lớp lưu trữ DomainServiceHost nội bộ, lớp này sử dụng lớp WCF ServiceHost để lưu trữ ứng dụng. Để làm cho dịch vụ miền có thể truy cập được cho dự án máy khách, nó phải có thuộc tính EnableClientAccessAttribute. Thuộc tính được áp dụng tự động bất cứ khi nào một lớp dịch vụ miền mới được thêm vào.

Hình sau cho thấy kiến ​​trúc của Dịch vụ miền WCF RIA -

Dịch vụ WCF RIA - Dữ liệu truy vấn

Hình sau cho thấy cách một truy vấn được tạo ở phía máy khách và được thực thi ở phía máy chủ để trả về kết quả có thể truy vấn. DAL là viết tắt của Data Access Layer.

Dịch vụ WCF RIA - Cập nhật dữ liệu

Hình dưới đây cho thấy cách dữ liệu được cập nhật bằng cách thực hiện thao tác CUD (Create Update Delete) ở phía máy chủ. Cần lưu ý ở đây rằng dịch vụ WCF RIA luôn không trạng thái ở phía máy chủ.

Dịch vụ WCF tự hào có một hệ thống bảo mật mạnh mẽ với hai chế độ hoặc cấp độ bảo mật để chỉ một khách hàng chủ định mới có thể truy cập các dịch vụ. Các mối đe dọa bảo mật phổ biến trong một giao dịch phân tán được WCF kiểm duyệt ở mức độ lớn.

Các tính năng bảo mật chính

Dịch vụ WCF có bốn tính năng bảo mật chính như được mô tả trong hình bên dưới.

  • Authentication - Ở đây, xác thực không chỉ giới hạn trong việc xác định người gửi tin nhắn, mà là xác thực lẫn nhau, tức là cần xác thực người nhận tin nhắn để loại trừ khả năng xảy ra bất kỳ loại tấn công trung gian nào.

  • Authorization- Đây là bước tiếp theo được thực hiện bởi một dịch vụ WCF để đảm bảo an ninh và ở đây nó được xác định liệu dịch vụ có cho phép người gọi tiến hành thêm hay không. Mặc dù ủy quyền không phụ thuộc vào xác thực, nó thường tuân theo xác thực.

  • Confidentiality- Việc trao đổi thông tin giữa người gọi và một dịch vụ được giữ bí mật để hạn chế việc người khác giải thích thông tin không nhằm mục đích sử dụng. Để làm được điều này, mã hóa được sử dụng cùng với nhiều cơ chế khác.

  • Integrity - Khái niệm chính cuối cùng là duy trì tính toàn vẹn, tức là cung cấp sự đảm bảo rằng thông điệp không bị can thiệp bởi bất kỳ ai trong hành trình của nó từ người gửi đến người nhận.

Chuyển chế độ bảo mật

WCF cung cấp các chế độ bảo mật truyền sau đây để đảm bảo giao tiếp an toàn giữa máy khách và máy chủ. Các chế độ bảo mật chuyển tiền đa dạng được đề cập dưới đây.

  • None- Chế độ này không đảm bảo bất kỳ loại bảo mật tin nhắn nào và dịch vụ không nhận được bất kỳ thông tin xác thực nào về khách hàng. Chế độ này rất rủi ro, vì nó có thể cho phép giả mạo tin nhắn và do đó không được khuyến khích.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "None"/>
   </binding>
</wsHttpBinding>
  • Transport- Chế độ này là cách dễ nhất để đạt được việc truyền thông điệp an toàn thông qua việc sử dụng các giao thức truyền thông như TCP, IPC, Https và MSMQ. Chế độ này hiệu quả hơn khi truyền là điểm-điểm và được sử dụng chủ yếu trong môi trường được kiểm soát, tức là các ứng dụng mạng nội bộ.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "Transport"/>
   </binding>
</wsHttpBinding>
  • Message- Chế độ bảo mật cho phép xác thực lẫn nhau và cung cấp sự riêng tư ở mức độ lớn vì các tin nhắn được mã hóa và có thể được truyền qua http, đây không được coi là một giao thức an toàn. Ở đây, bảo mật được cung cấp từ đầu đến cuối mà không cần xem xét có bao nhiêu người trung gian tham gia vào quá trình truyền thông điệp và liệu có sự vận chuyển an toàn hay không. Chế độ này thường được sử dụng bởi các ứng dụng internet.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "Message"/>
   </binding>
</wsHttpBinding>
  • Mixed - Chế độ bảo mật này không được sử dụng thường xuyên và xác thực máy khách chỉ được cung cấp ở cấp máy khách.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "TransportWithMessageCredential"/>
   </binding>
</wsHttpBinding>
  • Both- Chế độ bảo mật này bao gồm cả bảo mật truyền tải và bảo mật tin nhắn để cung cấp một lớp bảo mật mạnh mẽ, nhưng thường dẫn đến quá tải hiệu suất tổng thể. Điều này chỉ được hỗ trợ bởi MSMQ.

<netMsmqBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "Both"/>
   </binding>
</netMsmqBinding>

Tất cả các ràng buộc WCF ngoại trừ BasicHttpBinding đều có một số mức độ bảo mật chuyển theo mặc định.

Mức độ bảo mật tin nhắn

Bảo mật mức thông báo không phụ thuộc vào các giao thức WCF. Nó được sử dụng với chính dữ liệu tin nhắn bằng cách mã hóa dữ liệu bằng cách sử dụng một thuật toán tiêu chuẩn. Một số thông tin xác thực khách hàng có sẵn cho các ràng buộc khác nhau đối với mức bảo mật thư và những thông tin này sẽ được thảo luận bên dưới.

Client credentials for message level security in WCF

None- Ở đây, mã hóa được sử dụng để bảo mật tin nhắn, trong khi không có xác thực máy khách nào được thực hiện có nghĩa là dịch vụ có thể được truy cập bởi một máy khách ẩn danh. Ngoại trừ BasicHttpBinding, tất cả các ràng buộc WCF đều hỗ trợ thông tin xác thực ứng dụng khách này. Tuy nhiên, cần lưu ý rằng đối với NetNamedPipeBinding, thông tin xác thực ứng dụng khách này hoàn toàn không khả dụng.

  • Windows- Tại đây, cả mã hóa tin nhắn và xác thực máy khách đều diễn ra cho người dùng đã đăng nhập theo thời gian thực. Trong trường hợp này, không giống như tất cả các ràng buộc WCF khác, NetNamedPipeBinding không khả dụng và BasicHttpBinding không hỗ trợ.

  • UserName- Tại đây, các tin nhắn được mã hóa cũng như được bảo mật bằng cách cung cấp Tên người dùng và khách hàng được xác thực khi họ cần cung cấp mật khẩu. BasicHttpBinding cũng giống như hai thông tin đăng nhập máy khách ở trên, không hỗ trợ UserName và nó không khả dụng cho NetNamedPipeBinding.

  • Certificate- Cùng với mã hóa tin nhắn, cả máy khách và dịch vụ đều nhận được xác thực bằng chứng chỉ. Thông tin xác thực ứng dụng khách này có sẵn và được hỗ trợ bởi tất cả các ràng buộc WCF ngoại trừ NetNamedPipeBinding.

  • IssuedToken- Mã thông báo được cấp từ một cơ quan như Cardspace được sử dụng để xác thực tin nhắn. Mã hóa tin nhắn cũng được thực hiện ở đây.

Đoạn mã sau đây cho thấy cách thông tin đăng nhập của ứng dụng khách được cấu hình trong chế độ / cấp độ bảo mật thư WCF.

<netTcpBinding>
   <binding name = "WCFMessageSecurityExample">
      <security mode = "Message">
         <message clientCredentialType = "None"/>
      </security>   
   </binding>
</netTcpBinding>

<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>

Ở đây, cần lưu ý rằng chế độ bảo mật truyền tải có lợi thế hơn cấp độ bảo mật tin nhắn, vì chế độ này nhanh hơn. Nó không yêu cầu bất kỳ mã hóa bổ sung nào và cung cấp hỗ trợ khả năng tương tác, do đó không làm giảm hiệu suất tổng thể.

Tuy nhiên, từ quan điểm bảo mật, chế độ bảo mật tin nhắn mạnh mẽ hơn và độc lập với các giao thức và cung cấp bảo mật đầu cuối.

Nhà phát triển dịch vụ WCF có thể gặp phải một số lỗi không lường trước được yêu cầu báo cáo cho khách hàng theo cách phù hợp. Những lỗi như vậy, được gọi làexceptions, thường được xử lý bằng cách sử dụng khối try / catch, nhưng một lần nữa, đây là công nghệ rất cụ thể.

Vì khu vực quan tâm của khách hàng không phải về cách xảy ra lỗi hoặc các yếu tố gây ra lỗi, hợp đồng SOAP Fault được sử dụng để truyền thông báo lỗi từ dịch vụ đến máy khách trong WCF.

Hợp đồng lỗi cho phép khách hàng có cái nhìn dạng văn bản về các lỗi xảy ra trong một dịch vụ. Ví dụ sau đây cho bạn hiểu rõ hơn.

Step 1 - Một dịch vụ máy tính dễ dàng được tạo ra với phép toán chia sẽ tạo ra các ngoại lệ chung.

using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Runtime.Serialization;
usingSystem.ServiceModel;
usingSystem.Text;

namespace Calculator {
   // NOTE: You can use the "Rename" command on the "Refactor" menu to change 
   // the interface name "IService1" in both code and config file together.
   
   [ServiceContract]
   
   public interface IService1 {
      [OperationContract]
      int divide(int num1, int num2);
      // TODO: Add your service operations here
   }
}

Mã hóa cho tệp lớp được hiển thị bên dưới:

Bây giờ, khi chúng ta cố gắng chia số 10 cho số 0, dịch vụ máy tính sẽ đưa ra một ngoại lệ.

Ngoại lệ có thể được xử lý bằng khối try / catch.

Bây giờ, khi chúng ta cố gắng chia bất kỳ số nguyên nào cho 0, nó sẽ trả về giá trị 10 vì chúng ta đã xử lý nó trong khối catch.

Step 2 - FaultException được sử dụng trong bước này để truyền thông tin ngoại lệ cho máy khách từ dịch vụ.

public int Divide(int num1, int num2) { 
   //Do something 
   throw new FaultException("Error while dividing number"); 
}

Step 3- Cũng có thể tạo một kiểu tùy chỉnh để gửi thông báo lỗi bằng FaultContract. Các bước cần thiết để tạo một loại tùy chỉnh được đề cập bên dưới:

Một kiểu được xác định bằng cách sử dụng hợp đồng dữ liệu và các trường dự định trả về được chỉ định.

Hoạt động dịch vụ được trang trí bởi thuộc tính FaultContract. Tên loại cũng được chỉ định.

Một cá thể dịch vụ được tạo để nâng cao các ngoại lệ và các thuộc tính ngoại lệ tùy chỉnh được chỉ định.