[ Đăng nhập | Ghi danh ]

Hosting WCF Service bằng ứng dụng Console Application

Bài viết được cập nhật từ 11:53:03 SA, 05 Tháng Bảy 2012 bởi anbinhtrong

Bài viết này nhằm hướng dẫn cho bạn cách thiết lập dịch vụ đơn giản và vận hành nó bằng ứng dụng Console Application. Bạn sẽ thấy việc xây dựng một dịch vụ WCF và kết nối để sử dụng nó thật dễ dàng.

Bài viết được hiệu đính bởi Lê Hoàng Dũng (tumivn).

WCF là nền tảng của Microsoft giúp bạn có thể xây dựng được các dịch vụ cung cấp dữ liệu cho các ứng dụng từ nhiều nền tảng khác nhau có thể kết nối và sử dụng. Với WCF bạn có thể cung cấp các dịch vụ thông qua nhiều giao thức khác nhau chỉ bằng một lần cài đặt duy nhất cho dịch vụ và cấu hình bằng mã lệnh hoặc tập tin cấu hình (XML) để cấu hình các giao thức mà dịch vụ hỗ trợ.

Bài viết này nhằm hướng dẫn cho bạn cách thiết lập dịch vụ đơn giản và vận hành nó bằng ứng dụng Console Application. Bạn sẽ thấy việc xây dựng một dịch vụ WCF và kết nối để sử dụng nó thật dễ dàng.

Có nhiều cách khác nhau để host một dịch vụ WCF. Bạn có thể sử dụng :

Trong bài viết này, tôi sẽ hướng dẫn các bạn cách xây dựng 1 console application đơn giản để chứa 1 service.

Bước 1: Bạn tạo 1 project Console Application tên MyCalculatorService. Service chỉ có 3 phương thức chính:

Bước 2: Bạn cần tham chiếu đến 2 assembly là System.ServiceModel.dll và System.RuntimeSerialization.dll

Pic 1

Bước 3:

Tạo interface ISimpleCalculator, thêm thuộc tính ServiceContract và DataContract vào class và hàm như bên dưới. Đối với dữ liệu tự định nghĩa, bạn phải thêm thuộc tính DataContract:


    [ServiceContract()]
    public interface ISimpleCalculator
    {
        [OperationContract]
        string HelloWorld();        

        [OperationContract]
        string Hello(Person person);

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

    [DataContract]
    public class Person
    {
        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }
    }
 

 

Service Contract: Định nghĩa các phương thức của một dịch vụ, thực chất là các hành động mà client có thể sử dụng ở các điểm cuối (endpoint).

Operation Contract: Chỉ ra phương thức được gắn thuộc tính là phương thức của dịch vụ.

Đối với kiểu dữ liệu tự định nghĩa, bạn phải báo cho WCF kiểu dữ liệu cần trao đổi với client và thêm thuộc tính DataContract cho class và DataMember cho các trường thuộc tính trong class

Bước 4:

Tạo class SimpleCalculatorService thực thi từ Interface ISimpleCalculator


    public class SimpleCalculatorService: ISimpleCalculator
    {
        public string HelloWorld()
        {
            return "Hello World";
        }

        public string Hello(Person person)
        {
            return "Hello " + person.FirstName;
        }

        public int Add(int num1, int num2)
        {
            return num1 + num2;
        }
    }
 

 

Bước 5:

ServiceHost là class chính để host dịch vụ WCF. Bạn cần truyền contract class và base address cho ServiceHost. Bạn có thể đăng ký nhiều base addresses cách nhau bởi dấu phẩy, nhưng mỗi địa chỉ phải khác nhau về phương thức.


            var httpUrl = new Uri("http://localhost:8090/MyService/SimpleCalculatorService");

            var tcpUrl = new Uri("net.tcp://localhost:8090/MyService/SimpleCalculatorService");

            var host = new ServiceHost(typeof(SimpleCalculatorService), httpUrl, tcpUrl);
 

 

Bạn có thể đăng ký nhiều Endpoint bằng phương thước ServiceHost.AddServiceEndpoint().

Bước 6:

Thực thi host để chạy Service


using System;
using System.Globalization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SimpleSelfHostInWCF
{
    class Program
    {
        static void Main()
        {
            //Create a URI to serve as the base address
            var httpUrl = new Uri("http://localhost:8090/MyService/SimpleCalculatorService");
            //Create ServiceHost
            var host = new ServiceHost(typeof(SimpleCalculatorService), httpUrl);
            //Add a service endpoint
            host.AddServiceEndpoint(typeof(ISimpleCalculator)
            , new WSHttpBinding(), "");
            //Enable metadata exchange
            var smb = new ServiceMetadataBehavior
                          {
                              HttpGetEnabled = true
                          };
            host.Description.Behaviors.Add(smb);
            //Start the Service
            host.Open();

            Console.WriteLine("Service is host at " + DateTime.Now.ToString(CultureInfo.InvariantCulture));
            Console.WriteLine("Host is running... Press <Enter> key to stop");
            Console.ReadLine();

        }
    }
}
 

 

Bước 7: Tạo chương trình để Test Serivice

Bạn tạo 1 Console Application gọi là Client. Bạn phải tạo 1 proxy class (lớp đại diện thực hiện việc kết nối với Service) cho client. Có nhiều cách để thực hiện:

Ở đây mình chọn cách 2.

Nhấp phải vào Project=> Add Service Reference. Gõ địa chỉ hostUrl: http://localhost:8090/MyService/SimpleCalculatorService

Add Service Reference

Trong file App.config, bạn chú ý đến dòng sau:


<client>
            <endpoint address="http://localhost:8090/MyService/SimpleCalculatorService"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ISimpleCalculator"
                contract="CalculatorService.ISimpleCalculator" name="WSHttpBinding_ISimpleCalculator">
                <identity>
                    <userPrincipalName value="Crystal-PC\Crystal" />
                </identity>
            </endpoint>
        </client>
 

 


<client>
            <endpoint address="http://localhost:8090/MyService/SimpleCalculatorService"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ISimpleCalculator"
                contract="CalculatorService.ISimpleCalculator" name="WSHttpBinding_ISimpleCalculator">
                <identity>
                    <userPrincipalName value="Crystal-PC\Crystal" />
                </identity>
            </endpoint>
        </client>
 

 

WSHttpBinding_ISimpleCalculator: tên Endpoint để kết nối với Service

Nếu bạn chỉ có duy nhất 1 Endpoint, bạn không cần chỉ ra tên Endpoint khi kết nối.

Trường hợp 1 Endpoint:


var pp = new SimpleCalculatorClient(); 

 

Trường hợp nhiều EndPoint:


var pp1 = new SimpleCalculatorClient(“FirstEndpointName”);
var pp2 = new SimpleCalculatorClient(“SecondEndpointName”);
 

 

Bước 8: Thực thi chương trình


    class Program
    {
        static void Main(string[] args)
        {
            var pp = new SimpleCalculatorClient("WSHttpBinding_ISimpleCalculator");//hoặc sử dụng var pp = new SimpleCalculatorClient("");
            Console.WriteLine(pp.HelloWorld());
            Console.WriteLine(pp.Hello(new Person{ FirstName = "Binh Trong", LastName = "An"}));
            Console.WriteLine(pp.Add(5, 3));
            pp.Close();
            Console.ReadKey();
        }
    }
 

 Client

Như vậy bạn đã thành công trong việc xây dựng cho mình một ứng dụng Console dùng để host WCF Service!

Happy coding!

 

Update comment..