Nine MVP's Blog

10/04/2010

WCF Series : เริ่มต้น (Begin) I

Filed under: Uncategorized — Nine MVP @ 6:51 am

WCF Series : เริ่มต้น (Begin) I

WCF Series : xxx II

Tools and Language

  1. Visual Studio 2010 RC or later 
  2. C#

แนะนำบทความ

บทความนี้ตั้งใจจะสร้างชุมชนผู้ใช้งาน WCF อย่างจริงจัง เนื่องจากไม่ค่อยจะพบเห็นใครใช้งาน อาจจะเพราะติดปัญหาไม่ว่าจะเรื่องความเข้าใจพื้นฐาน ความรู้ความเข้าใจในการพัฒนา  การนำไปใช้งาน ติดปัญหาเรื่องความปลอดภัย ไม่ประสบความสำเร็จการนำไปติดตั้งใช้งานจริง ซึ่งซีรี่ย์ที่ผมเขียนนี้จะครอบคลุมเรื่องเหล่านี้ทั้งหมด และจะคอยตอบและแก้ไขปัญหาให้ด้วยครับ

ซึ่งในตอนแรกจะเป็นการกล่าวถึง WCF แบบกว้าง ๆ ทำความเข้าใจโครงสร้างและการทำงานเบื้องต้น รวมไปถึงวิธีการสร้างเพื่อนำไปใช้งานเบื้องต้นครับ

ยุคเริ่มต้น ASP.NET Web Services 

คงไม่ย้อนยุคกลับไปสมัยโบราณมากมาย เริ่มต้นกันที่ Web Services ใน .NET นั้นมีมาตั้งแต่รุ่น .NET 1.0 จนมาถึงปัจจุบัน .NET 3.5 SP1 ซึ่งได้หยุดพัฒนาแล้ว ASP.NET Web Service เป็นอะไรที่เรียบง่ายมาก ๆ สามารถเขียน WebMethod ได้เหมือนการเขียนฟังชั่นปกติธรรมดา แม้กระทั่งการคืนค่ากลับจากก็เหมือนการเขียนฟังชั่นเช่นกัน แต่มาถึงยุคการสื่อสารไร้พรหมแดนอย่าง SOA สำหรับ ASP.NET Web Services นั้น ไม่พอเพียง ทั้งเรื่อง interoperaion, performance, security, extensibility  ที่ต้องเพิ่มแติมและเปลี่ยนแปลงอยู่เรื่อย ๆ จึงจะทำให้สิ้นยุคของ ASP.NET Web Service ในไม่นานนี้

WCF นั้นคืออะไร? (What’s WCF)

WCF (Windows Communication Foundation) มีมาตั้งแต่ .NET 3.0 แล้วครับ วัตถุประสงค์ก็เพื่อช่วยขยับขยายขีดความสามารถของ ASP.NET Web Service ที่เราใช้กันอยู่ในอดีตมาจนถึงปัจจุบันนี้ก็คิดว่ายังมีหลายท่านเลือกใช้กันเป็นระบบหลัก    ซึ่งทางไมโครซอฟต์ตั้งใจพัฒนา WCF ขึ้นเพื่อรองรับลักษณะงานประเภท SOA ในกรณีที่มีระบบ(System) หรือผู้ใช้(User) ที่มีความหลากหลายในด้านมาตรฐานการสื่อสาร(Protocol) มีประสทธิภาพการทำงานที่รวดเร็วขึ้นกว่าเดิม      สามารถนำ Service ที่พัฒนาไว้นั้นไปรันบนโฮสต์ชนิดต่าง ๆ ได้ และยังรวมไปถึงระบบรักษาความปลอดภัยที่พัฒนาให้รองรับกับมาตรฐานที่มีและรองรับอนาคตอีกด้วย     ซึ่ง ASP.NET Web Service ไม่สามารถตอบโจทย์ที่ว่านี่ได้ จึงเป็น New Generation Web Service ของทางไมโครซอฟต์ที่มีมาให้เลือกใช้ครับ

รายละเอียดเพิ่มเติมอ่านต่อได้ที่นี่ วิวัฒนาการก่อนจะมาเป็น WCF คุณนเรศเขียนไว้ได้ละเอียดดีครับ

วิวัฒนาการของ WCF (WCF Evolution)

เริ่มต้นก้าวแรกสำหรับ WCF ได้ออกตามหลัง Visual Studio 2005 เป็นปลั๊กอินชื่อว่า Visual Studio 2005 extensions for.NET Framework 3.0    เป็นก้าวแรกที่ microsoft ตั้งใจที่จะพัฒนาให้ .NET ได้มีที่ยืนในกลุ่มโปรดักของ SOA   ซึ่งถือว่าได้เปิดตัว WCF เป็นครั้งแรกโดยมีความสามารถตามที่ได้กล่าวไปข้างต้น    ต่อมาสำหรับ WCF 3.5 นั้นได้ออกมาพร้อมกับ Visual Studio 2008 โดยเพิ่มเติมการทำงานในส่วนของ SOA เข้าไปอีกก็คือ Workflow Services และเมื่อ Visual Studion 2008 ได้ปล่อย Service Pack 1 ก็ได้มีการอัพเกรดเวอชั่น WCF เป็น SP1 ไปด้วยในตัวโดยเพิ่มเติมด้าน Web Programming เข้ามา     ซึ่ง WCF 3.5 SP1 เป็นตัวที่ใช้กันเป็น production อยู่ในปัจจุบัน    จนกระทั่งที่เขียนบทความนี้อยู่ WCF 4.0 Release Candidate version ก็มีให้เราได้ทดสอบใช้งานกัน และบทความนี้จะใช้ WCF 4.0 เป็นหลัก ตั้งแต่พื้นฐานเป็นต้นไปครับ

WCF FEATURE TABLE: (แต่ละฟีเจอร์จะอธิบายแนะนำการใช้งานรอบหลังอีกครั้ง)

WCF 3.0

  • One-way and duplex messaging 
  • Synchronous and asynchronous remote procedure calls 
  • Callbacks  
  • Sessions   
  • Multi-contract services 
  • Transport- and message-based security, reliability, and ordered delivery  
  • Queued messaging   
  • Transaction support  

WCF 3.5 and SP1

  • WCF and WF Integration—Workflow Services 
  • Durable Services
  • WCF Web Programming Model
  • WCF Syndication
  • WCF and Partial Trust
  • WCF and ASP.NET AJAX Integration
  • Web Services Interoperability
  • Expanded UriTemplate syntax
  • Syndication OM for the Atom Publishing Protocol.
  • Attribute-free Data Contract serialization.
  • Interoperable Object References.
  • Improved logging/tracing in Partial Trust.
  • Scalability Improvements on IIS7

WCF 4.0

  • Configuration Based Activation.
  • System.Web.Routing Integration
  • Multiple IIS Site Bindings Support
  • Routing Service
  • Support for WS-Discovery
  • Standard Endpoints
  • Workflow Services
  • Target Framework Attribute
  • WCF REST
    1. Caching
    2. Formats Support
    3. HTTP REST Error Handling
    4. Deployment Features
    5. Cross Domain JavaScript

 

โครงสร้างสถาปัตยกรรมของ WCF (WCF Architecture)

กล่าวถึงสถาปัตยกรรมของตัว WCF แล้วนั้นจะมีโครงสร้างที่ไม่ซับซ้อน และควรจะเรียนรู้ไว้ เนื่องจากมีความจำเป็นที่จะต้องทำความเข้าใจ เพื่อใช้ในการวิเคราะหฺ์ออกแบบการทำงานของเซอร์วิสที่เราจะพัฒนาด้วย  อ่านไปเรื่อย ๆ ทำความเข้าใจกันก่อนจะ coding กัน

 

ไดอะแกรมด้านบนนี้เป็นโครงสร้างพื้นฐานของ WCF โดยได้แบ่งเอาไว้เป็นชั้น ๆ (Layer) ดังที่เห็น ซึ่งจำเป็นที่เราจะต้องเข้าใจครับว่าแต่ละส่วนคืออะไร ผมขออธิบายสั้น ๆ ได้ดังนี้

Application

คือส่วนที่เราได้ทำการ implement code ตัวเซอร์วิสไว้เช่น method, code logic, entity ต่างๆ ที่ใช้ในการทำงานของตัวเซอร์วิส

Contracts

Contract Layer เป็นชั้นที่เชื่อมต่อกับ Application Layer ซึ่งนักพัฒนาจะทำงานโดยตรงกับส่วนนี้เพื่อใช้ในการสร้างตัวเซอร์วิสต่าง ๆ     

  • Service contracts

– เป็นส่วนที่บ่งบอกว่าเซอร์วิสที่เราสร้างขึ้นนั้นมี operation (Method) อะไรไว้ให้บริการบ้าง ตัวอย่างเช่น บริการคำนวนภาษี, ให้ข้อมูลอัตราแลกเปลี่ยนค่าเงิน เป็นต้น

[ServiceContract]
public interface IMoneyServices
{
  [OperationContract]
   string CalculateTAX(decimal money, float vatRate);
}

จากตัวอย่างโค้ดด้านบน จะมีการใช้งานอินเตอร์เฟสในการกำหนดโครงสร้างของตัวเซอร์วิสของเรา โดยอาศัยแอททริบิ้วที่ชื่อ [ServiceContract] เป็นตัวบอก WCF ให้ทราบว่านี่คือเซอร์วิสที่ให้บริการ  และใช้แอททริบิ้ว [OperationContract] กำหนดบนเม็ดธอดของอินเตอร์เฟสเพื่อบอก WCF ว่าเม็ดธอดนี้จะเปิดเผยแก่ผู้ขอใช้บริการเซอร์วิสนี้    ส่วนนี้ยังไม่สิ้นสุดการสร้างเซอร์วิสเป็นเพียงการกำหนดโครงสร้างเท่านั้น ต้องนำอินเตอร์เฟสที่ได้ไปทำการ implement บนคลาสใด ๆ อีกครั้งหนึ่ง

สงสัย Interface นั้นคืออะไร? กดที่นี่

  • Data contract

– เป็นส่วนที่กำหนดโครงสร้างข้อมูลต่าง ๆ ที่มีรับส่งข้อมูลทั้งอินพุทและเอ้าท์พุทโดย Operation Contract ของ Service Contracts ซึ่งอาจจะประกอบไปด้วย ชนิดข้อมูลพื้นฐาน (Primitive Data Type) เช่น string, int, decimal, float, double, bool  และกลุ่มข้อมูลโครงสร้างที่ซับซ้อน (Complex Data Type) อย่างเช่น Class, Enumeration Data ต่าง ๆ ดังตัวอย่าง

[DataContract]
public class PurchaseOrder
{
   private int poId_value;

   [DataMember]
   public int PurchaseOrderId
   {
      get { return poId_value; }
      set { poId_value = value; }
   }
}

จากตัวอย่างโค้ดด้านบนจะเห็นว่าแอททริบิ้ว [DataContract] จะถูกกำหนดไว้บนคลาส เพื่อบอก WCF ว่าให้ทำการเปิดเผยคลาสนี้ลงใน WSDL ด้วย  และแอททริบิ้ว [DataMember] นั้นจะเป็นตัวบอก WCF ให้ทำการเปิดเผย data property นี้ลงไปใน WSDL ด้วย   ตัวอย่างต่อไปคือความสัมพันธ์ระหว่าง ServiceContract และ DataContract

[ServiceContract]
public interface ISampleInterface
{
    [OperationContract]
    double SquareRoot(int root);

    [OperationContract]
    bool ApprovePurchaseOrder(PurchaseOrder po);
}

จากโค้ดด้านบนนี้จะเห็นว่า OperationContract ทั้งสองตัวมีการใช้งาน Primitive Data Type และ Complex Data Type

  1. SqaureRoot มีพารามิเตอร์เข้าชื่อ root มีชนิดเป็น int  และส่งค่ากลับเป็น double
  2. ApprovePurchaseOrder มีพารามิเตอร์เข้าชื่อ po มีชนิดเป็น PurchaseOrder Class และส่งค่ากลับเป็น bool     ซึ่ง PurchaseOrder Class เราได้ประกาศเป็น DataContract ไว้ก่อนนี้ เนื่องจากเป็น Complex Data Type จึงต้องระบุให้ WCF ทำการนำโครงสร้างของคลาสไปบรรยายไว้ใน WSDL ด้วย
  • Message Contract

– โดยปกติข้อมูลที่ส่งข้ามกันระหว่าง Service และ Client นั้น ถูกกำหนดรูปแบบอยู่ใน SOAP Message อยู่แล้ว แต่บางครั้งเนื่องจากความต้องการในการรองรับการทำงานต่าง ๆ เช่น ต้องการจัดรูปแบบโครงสร้างเมสเสจใหม่, อยากใช้ Header, การเพิ่มเติม Status เหล่านี้  เราจะต้องอาศัย Message Contract เป็นตัวช่วยครับ

  • Policies and Binding

– ส่วนของ Policies และ Binding นั้นเป็นตัวกำหนดตั้งค่าเงื่อนไขและวิธีการให้เซอร์วิสของเรามีการติดต่อสื่อสารในรูปแบบใด (Protocol) ใช้ระบบการรักษาปลอดภัย (Security) แบบไหน และอื่น ๆ อีกมากมาย

Service Runtime

– เป็นส่วนที่กำหนดพฤติกรรม (Behavior) การทำงานของเซอร์วิส ขณะที่เซอร์วิสทำงานอยู่ มีดังนี้

  • Throttling Behavior- ใช้กำหนดจำนวนของเมสเสจที่จะเข้ามาทำงานในเซอร์วิส
  • Error Behavior – หากมีปัญหาเกิดขึ้นภายในเซอร์วิส ใช้มาช่วยทำการจัดการปัญหาดังกล่าว
  • Metadata Behavior – ใช้กำหนดการเปิดเผยข้อมูลโครงสร้าง (MetaData) ของเซอร์วิส แก่ผู้ใช้งาน
  • Instance Behavior – ใช้กำหนดจำนวนของผู้ใช้ที่จะเข้ามาใช้งานในเซอร์วิสโดยพร้อม ๆ กันขณะที่เซอร์วิสทำงานอยู่ 
  • Transaction Behavior – ช่วยในการย้อนกลับ (Rollback) การทำงานหากโอเปอเรชั่นเกิดการทำงานที่ผิดพลาดขึ้น 
  • Dispatch Behavior – เป็นตัวควบคุมว่าเมสเสจต่าง ๆ นั้นจะเข้าการโปรเซสด้วยสถาปัตยกรรมใดของ WCF

Messaging

– ใน Messaging Layer นี้เป็นการจัดการเมสเสจที่ส่งเข้าออกภายในเซอร์วิส ทั้งการกำหนดรูปแบบของเมสเสจโด การวิธีการแลกเปลี่ยนเมสเสจซึ่งพอจะแบ่งได้เป็นสองกลุ่มดังนี้

  • Transport channels :  จะทำการอ่านและเขียนเมสเสจจากเน็ตเวิร์กภายในหรือภายนอกองค์กร มีบาง transports จำเป็นต้องมีการแปลง (encoder) เมสเสจจากหน่วยสตรีมไบท์ที่ใช้รับส่งกันในเน็ตเวิร์กมาเป็น XML เช่น HTTP, named pipes, TCP, และ MSMQ
  • Protocol channels :  เป็นการทำงานโปรโตคอลระดับเมสเสจ โดยส่วนใหญ่เป็นการเขียนอ่านในส่วนของหัวเมสเสจเช่น WS-Security Protocol เป็นการกำหนดใช้ความปลอดภัยในระดับชั้นเมสเสจ และ WS-Reliability Protocol เป็นการการันตีการส่งเมสเสจระหว่างกัน

Activation and Hosting

– เซอร์วิสที่ได้สร้างไว้เป็นเพียงไลบราลี่เท่านั้น เราต้องการนำไปรันบนโฮสครับ เพื่อให้เซอร์วิสสามารถซึ่งมีให้เลือกใช้อยู่หลายวิธีดังนี้

  • Internet information Service (IIS)

    ก็คือเว็บเซอร์นั้นเอง เป็นโฮสที่ดีมีข้อดีหลายข้อในการเลือกใช้งานเป็นโฮสให้แก่ WCF Service ของเรา เน้นไปในเรื่องของการทำ Load Balance  การขยับขยายความสามารถในการรองรับผู้ใช้ในอนาคต  ข้อเสือคือทำงานบน HTTP ได้เพียงโปรโตคอล และเซอร์วิสจะไม่ทำงานจนกว่าจะมีการร้องขอการทำงานมาจากผู้ใช้หรือระบบอื่น ๆ

  • Windows Activation Service (WAS)

    เป็นของใหม่ที่ส่งมาพร้อมกับ IIS 7.0 จะทำงานเมื่อมีการร้องขอบริการเข้ามา รองรับเกือบทุกโปรโตคอล HTTP, TCP, Named Pipes, MSMQ

  • Self-Hosting

    เป็น executeable ได้เช่น console app, win app, WPF app เป็นต้น ไม่สามารถทำงานอัตโนมัติได้ ต้องรันโปรแกรมทุกครั้งเพื่อให้โฮสทำงาน

  • Windows Service

    คล้ายกับ Executable โฮส แต่จะทำงานอัตโนมัติทุกครั้งที่ Windows Start

  • COM+ 

    โฮสตัวนี้ส่วนใหญ่ไม่มีคนได้ใช้งาน เพราะค่อนข้างจะลึกลึกเรื่อง Windows Component Programming คงไม่ขอพูดถึงตลอดบทความนี้

 

 

ลงมือสร้าง (My First WCF)

อ่านหลักการทฤษฎีกันมายาว เรามาเริ่มสร้าง WCF ในเบื้องต้นกันต่อครับ

ตัวอย่าง Requierment คร่าว ๆ :  ทางบริษัทต้องการให้พัฒนาส่วนให้บริการข้อมูลสินค้าแก่ผ้ใช้งานทั่วไปผ่านทาง Web Service

1. เปิด Visual Studio

2. เลือก Menu File –> New –> Project..

3. เลือก Visual C# –> WCF –> .NET Framework 4.0 –> WCF Service Application –> Name : Vol1.Sample01.ProductSvc, Location: C:\WCFSeries, Solution Name: WCFSeries –> OK

4.  สังเกตูดูโครงสร้างโปรเจ็คที่ Visual Studio สร้างออกมาให้ดังนี้ครับ  

    • IService1.cs – คือ Service Contract
    • Service1.svc – คือ Host file ใช้สำหรับ Host ที่เป็น Web Site (IIS)
    • Web.config – คือ configuration file ของ wcf ที่จะใช้ตั้งค่าต่าง ๆ

5. แก้ไขไฟล์ IService1.cs เพื่อระบุข้อกำหนด (Contract) ของเซอร์วิสเราดังนี้    <———-  (Design Concept)

  • เปลี่ยนชื่อเป็น IProductService.cs
  • แก้ไข code ดังนี้

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

        namespace Vol1.Sample01.ProductSvc
        {
            // 1. สร้าง Interface สำหรับเป็น Contract ของระบบ
            [ServiceContract]
            public interface IProductService
            {
               // 2. กำหนด operation สำหรับ contract ที่จะใช้เป็น web method ให้ user ใช้งาน
                //    2.1 สร้าง interface method ชื่อ GetCurrentVatRate มีการรีเทิร์นค่ากลับเป็น float type
                [OperationContract]
                float GetCurrentVatRate();

                //    2.2 สร้าง interface method ชื่อ GetAllProduct มีการรีเทิร์นค่ากลับเป็น Product Class
                //    แต่เนื่องจาก Product Class นั้นยังไม่ได้สร้าง จึงต้องไปสร้าง class ที่ข้อ 2.3

                [OperationContract]
                List<Product> GetAllProduct();
            }

           // 2.3  สร้าง Product Class เพื่อใช้เป็น DataContract สำหรับ IProductService.GetAllProduct() method ในข้อ 2.2
             [DataContract] // DataContract เป็นตัวระบุว่าให้เปิดเผย Type นี้ผ่านทาง web service
            public class Product
            {
                [DataMember] // DataMember เป็นตัวระบุว่าให้เปิดเผย member ตัวนี้ผ่านทาง web service
                public string ProductID { get; set; }
                [DataMember]
                public string ProductName { get; set; }
                [DataMember]
                public decimal Price { get; set; }
                [DataMember]
                public float Weight { get; set; }
                [DataMember]
                public string Model { get; set;}
            }

        }

    6. แก้ไขไฟล์ Service1.svc ซึ่งเป็น host file จะผูกกับ Service1.svc.cs ซึ่งเป็น Service File  ให้เราทำการแก้ไขดังนี้  <———-  (Implement Concept)

    • 6.1 เปลี่ยนชื่อเป็น ProductService.svc ให้ถูกต้อง
    • 6.2 ดับเบิ้ลคลิ๊กที่ไฟล์ ProductService.svc.cs แล้วแก้ไข Code ดังนี้

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

    namespace Vol1.Sample01.ProductSvc
    {
       // ProductService คือ Service Class ที่เราจะเขียนโค้ดควบคุมการทำงานของเซอร์วิส
        public class ProductService : IProductService // นำ contract ที่ประกาศไว้มาใช้งานกับ service class
        {
            // operation จาก contract ถูกบังคับให้ประกาศใช้งานใน Service Class
            public float GetCurrentVatRate()
            {
                return 0.7f;
            }
           // operation จาก contract ถูกบังคับให้ประกาศใช้งานใน Service Class
            public List<Product> GetAllProduct()
            {
                return new List<Product>
                {
                    new Product{ProductID = "01", ProductName = "VIAO", Model = "VGN-FE44S/W", Price = 70000, Weight = 2.8f},
                    new Product{ProductID = "02", ProductName = "VIAO", Model = "VGN-FE45S/W", Price = 80000, Weight = 2.5f},
                    new Product{ProductID = "03", ProductName = "VIAO", Model = "VGN-FE46S/W", Price = 90000, Weight = 2.5f},
                    new Product{ProductID = "04", ProductName = "VIAO", Model = "VGN-FE47S/W", Price = 100000, Weight = 2.2f},
                    new Product{ProductID = "05", ProductName = "VIAO", Model = "VGN-FE48S/W", Price = 120000, Weight = 1.9f}
                };
            }
        }
    }

        • 6.3  แก้ไข Class Name ใน host file ใหม่ให้ถูกต้องเนื่องจากมีการแก้ไขจากด้านบน  คลิ๊กขวาที่ไฟล์ ProductService.svc.cs –> เลือก Open with –> เลือก Web Service Editor –> OK และแก้ไขตามตารางด้านล่างนี้
            <%@ ServiceHost Language="C#" Debug="true" Service="Vol1.Sample01.ProductSvc.ProductService" CodeBehind="ProductService.svc.cs" %>
      • 7.  ทำการทดสอบ WCF Service เบื้องต้น
        • 7.1  Build ด้วยการกด Ctrl+Shft+B หรือ menu –> Build –> Build Solution
        • 7.2  คลิ๊กขวาที่ไฟล์ ProductService.svc –> View in Browser เพื่อตรวจการทำงานเบื้องต้น

             

      • 8. ทดสอบสร้าง Client เพื่อเรียกใช้ WCF Service
        • 8.1 ไปที่ Menu –> File –> Add –> เลือก New Project..
        • 8.2  เลือก Visual C# –> Windows –> .NET Framework 4.0 –> Console Application –> Name: Vo1.Sample01.ConsoleTest –> กด OK

     

        • 8.3  จากนั้น คลิ๊กขวาที่ Project Vo1.Sample01.ConsoleTest  เลือก Add Service Reference…
        • 8.4 จะได้ output ตามรูปด้านล่างนี้ จะเห็นได้ว่ามี Service References (ProductService) คือ WCF Proxy Class  และ app.config ถูกสร้างขึ้น
        • 8.5 ทำการเรียกใช้ WCF ภายใน code ที่เราสร้างไว้ โดยดับเลิ้บคลิ๊กเปิด Program.cs มาทำการแก้ไข ตามตารางด้านล่างนี้

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

          namespace Vol1.Sample01.ConsoleTest
          {
              class Program
              {
                  static void Main(string[] args)
                  {

                     // ประกาศเรียกใช้ Service Client
                      var wsClient = new ProductService.ProductServiceClient();

                      // ทดสอบเรียก GetCurrentVatRate()
                      Console.WriteLine("GetCurrentVatRate() result = {0} \n", wsClient.GetCurrentVatRate());

                      // ทดสอบเรียก GetAllProduct()
                      var productResult = wsClient.GetAllProduct();
                      Console.WriteLine("———- GetAllProduct() —————–");
                      Console.WriteLine("———- List All Product —————–");

                      Console.WriteLine("\tProductID\tBrandName\tModel\tPrice\tWeight");
                      foreach (var product in productResult)
                      {
                          Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\t{4}", product.ProductID, product.BrandName, product.Model,
                                            product.Price, product.Weight);
                      }

                      Console.ReadKey();
                  }
              }
          }

     

        • 8.6  ทำการทดสอบ Client ด้วยการกด F5 จะได้ผลดังภาพด้านล่างนี้

     

    สรุปจากที่ได้เห็น โดยการเลือก WCF Service Application Project ในตอนแรกทำให้เราเลือกสร้าง WCF พร้อมเลือกโฮสประเภท Web host ไปด้วยในตัว  ซึ่งเหมือนกับการสร้าง ASP.NET Web Service แต่ขั้นตอนการสร้างอาจจะมากกว่า ASP.NET Web Service      เพราะ wcf มีโฮสใช้งานมากกว่า 1 ชนิดนั่นเองจึงต้องแยกพัฒนา service contract ออกมาอย่างชัดเจน      ซึ่งจะอธิบายการสร้าง Service และการเลือกใช้ Host ประเภทต่าง ๆ ในตอนหน้า

     


    สามารถ download source code ได้ที่นี่ 

       WCFSeries Code Sample Download Here!!

     

    Chalermpon Areepong Nine (นาย)

    Microsoft MVP Thailand ASP.NET

    email : nine_biz-talk.net at hotmail dot com

    2 Comments »

    1. Reblogged this on Torrrance.

      Comment by torrrance — 20/06/2013 @ 4:43 pm

    2. มาอธิบายตอนหน้าต่อเลยครับ อยากรู้แล้ว ขอบคุณครับ

      Comment by สิทธิเกียรติ หรูเจริญเกียรติ — 18/09/2014 @ 4:52 pm


    RSS feed for comments on this post. TrackBack URI

    Leave a Reply

    Please log in using one of these methods to post your comment:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Change )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Change )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Change )

    Google+ photo

    You are commenting using your Google+ account. Log Out / Change )

    Connecting to %s

    Blog at WordPress.com.

    %d bloggers like this: