Web Service มีไว้เพื่ออะไร และการ Reference WCF Web Service ลงใน .NET 2.0
ช่วงที่ผ่านมาผมจำเป็นต้องทำให้ Web Service แบบ WCF สามารถถูก Reference ได้ด้วย .NET 2.0
ก่อนที่จะมาเข้าเรื่องว่าทำยังไง (ซึ่งหลังจากค้นคว้าและลองผิดลองถูกแล้ว มันง่ายนิดเดียว) เรามาดูกันก่อนดีกว่าว่าปัญหาอะไรที่ทำให้มัน Reference ไม่ได้ถ้าไม่ Config ให้ถูก
Web Service คืออะไร
ถ้าว่ากันตรงๆ ง่ายๆ มันก็คือการเอา Function ในภาษาต่างๆ ไปวางไว้บนเว็บ โดยแปลง Parameter และ Result เป็น XML ทั้งหมด เช่น Web Service กระจอกๆ เช่น Web Service ที่ยัด Function สำหรับคิดเลข รับพารามิเตอร์ 3 ตัวคือ เลขแรก Operator และเลขที่สอง
แบบเก่า: //simpleservice/calculator?No1=2&Operator=Plus&No2=4
แบบ Service : //simpleservice/calculator?XML=<1stNumber>21stNumber>+<2ndNumber>42ndNumber>
แล้ว Response กลับมาได้ 6
อันนี้พูดแบบกระจอกๆ แต่จริงๆ XML ที่ส่งไปส่งมามันมีมาตรฐานมากกว่านั้น ลองหาเสริมความรู้ได้
Web Service มันเหนือกว่า Post/Response แบบเว็บโบราณ ตรงที่เราสามารถเรียกดูได้ว่าแต่ละ Service มีหน้าที่อะไร แล้วต้องการพารามิเตอร์อะไรบ้าง ซึ่งการเรียกหาพารามิเตอร์ ภาษาสากลจะเรียกว่าการถาม WSDL ทำให้ไม่เหมือนแบบเก่าตรงที่แบบเก่าเราต้องรู้มาก่อนว่า Web function แต่ละตัวต้องการอะไรบ้าง แล้วถ้าสิ่งที่ต้องการมันเปลี่ยน ก็ต้องให้โปรแกรมเมอร์ที่เขียน Function คอยอัพเดทให้คนใช้ทุกคน ถ้าเป็น Web Function แบบที่ใช้ในองค์กรคงไม่เป็นไร แต่นึกถึงสมมติคุณทำงาน Reuter แล้วเขียน Web Function ที่มีองค์กรทั่วโลก 1000 กว่าแห่งใช้สิครับ คุณจะมานั่งเมล์ไปทุกที่ว่าตอนนี้อัพเกรดใหม่ พารามิเตอร์เปลี่ยน คงใช้เวลาเป็นเดือนกว่าจะปรับความเข้าใจได้หมด แต่ถ้าเป็น Web Service คุณแค่อัพเดท WSDL คนทั่วโลกที่ใช้ก็จะรู้ทันทีว่าคุณอัพเดทใหม่แล้วนะ
ในทางทฤษฎีแล้ว Web Service ควรจะสามารถ Reference กันได้ เพราะเป็นบริการกลาง ไม่ว่าคุณจะใช้ Java C# C++ Ruby หรือภาษาอะไร ก็สามารถเรียกใช้ Service ได้ทั้งสิ้น เนื่องจากบริการกลางนี้คุยกันด้วย XML ดังนั้นขอแค่ภาษาคุณอ่าน XML ได้ ก็สามารถติดต่อกับ Web Service ได้ หรือแม้แต่ภาษาคุณอ่าน XML ไม่ได้ แต่คุณสร้างตัวอ่าน หรือพยายามแกะ Response ออกมาเอง ก็สามารถคุยได้เช่นกัน
แต่ในทางปฏิบัติ เนื่องจากเราคงไม่มานั่งแกะ XML ด้วยตัวเอง ซึ่งแต่ละภาษาก็มีตัวแกะให้ที่จะแปลงจาก XML มาเป็น Class Object ดังนั้นเราจึงต้องทำให้ XML ที่คืนออกมานั้นใช้งานได้บนภาษา
ปัญหาเรื่อง XML
สำหรับ XML นั้นมีเรื่องนึงที่ผมไม่ชอบเอามากๆ คือหัวของ XML จะมีการใส่ namespace เพื่อทำให้คลาสที่ส่งและคลาสที่รับอยู่ใน namespace เดียวกัน เช่น สมมติคลาสชื่อ SomeClass อยู่ใน MyNameSpace.SomeClass ถ้าหัวของ XML เป็น
แบบนี้ถ้าคุณพยายาม เอา SomeClass ที่มี Property, Field, Method เหมือนกันทุกประการ แต่อยู่ใน NameSpace2.SomeClass มารับข้อมูลจาก XML ตัวนี้ มันจะรับไม่ได้ เพราะมันคิดว่าเราเข้าใจผิดพยายามเอาอีกคลาสนึงมารับ
ตามทฤษฎีมันก็ควรจะเป็นเรื่องดี แต่ในทางปฏิบัติแล้ว หลายๆ ครั้งคลาสส่งกับคลาสรับ ตัวโปรแกรมเมอร์รู้อยู่แล้วว่ามันเป็นคลาสเดียวกัน แต่คนละ namespace อยากจะให้ใช้กันได้ แต่ .NET จะไม่ยอมให้ใช้แทนกัน เพราะมันตีความว่าเราโง่ เราเข้าใจผิด พยายามเอาข้อมูลในคลาสคนละคลาสมายัดใส่กัน ทั้งๆ ที่หลายครั้งเราไม่ได้เข้าใจผิด (สิ่งนี้ทำให้หลายๆ คนเลือกใช้ JSON แทนแล้วในการส่งข้อมูลผ่านเว็บ เพราะ JSON ไม่มี namespace บังคับ ขอแค่เรามีคลาสที่พอยัดได้ มันยัดให้เลย)
ทีนี้พอโปรแกรมเมอร์บ่นกันเยอะๆ Microsoft แก้ปัญหานี้ใน .NET 4.0 โดยการบังคับว่าคลาสที่โปรแกรมเมอร์รู้ว่าคนละ namespace แต่เป็นคลาสเดียวกัน จะใส่ namespace เป็น DataContract หมดเลย
แล้วคลาสไหนที่จะใช้รับส่งข้อมูล ก็ใส่ [DataContractAttribute] ไว้ข้างบนหัวคลาส ตัว XML Generator จะทำการแปลง namespace ให้เอง
Header ของ XML นอกจาก namespace แล้วยังมีอีกหลายค่า เช่น บอกว่า XML เวอร์ชั่นอะไร ส่งอะไรมา ซึ่ง Header ตัวนี้ Microsoft จะค่อนข้างบีบบังคับว่า ถ้า Header ผิด จะไม่ยอมทำอะไรเลย อย่างแค่ NameSpace ผิด ทั้งๆ ที่ข้อมูลมันยัดกันได้ ก็ไม่ยอมยัดให้
ปัญหาการ Reference ด้วย .NET 2.0
ปัญหาคือใน WCF Web Serivce โดยทั่วไป จะแปะ Header มาว่า type ของ XML เป็น "Application/XML" แต่ตัว .NET 2.0 จะรับเฉพาะ type "Text/xml" ซึ่งวิธีทำให้ WCF Web Service นั้นทำ type Text/XML ต้องเซ็ต 2 อย่าง (สำหรับรายละเอียด ลองอ่านในเว็บ Microsoft นะครับ)
1. Binding Config ต้องใช้ WebHttpBinding 2. Message Encoding ต้องใช้ Text
แค่นี้ก็ได้แล้วครับ
เกริ่นมานาน งานจริงๆ มีแค่นี้ แต่ผมเชื่อว่าโปรแกรมเมอร์ที่ดี ไม่ใช่แค่ทำงานเสร็จ แต่ต้องรู้ด้วยครับว่าที่มาของปัญหามันคืออะไร แล้วเทคโนโลยีที่ใช้อยู่มันมีที่มายังไง
Create Date : 04 กันยายน 2555 | | |
Last Update : 4 กันยายน 2555 9:10:27 น. |
Counter : 3265 Pageviews. |
| |
|
|
|