Web Service #5 : Using Visual Basic 6.0 as Client

    มีคนเขียนถามผมมาว่า มีวิธีใดหรือไม่ที่ให้เราใช้ VB 6.0 เป็น Client เพื่อเรียกใช้ Web Service คำตอบคือมีครับ ถึงแม้ว่า Web นี้จะมุ่งเน้นเฉพาะ C# ก็ตาม ในเมื่อมีผู้อยากรู้ผมก็จะเขียนครับ

    การที่จะให้ VB6 หรือภาษาใดๆ ก็ตามที่มีพื้นฐานจาก COM  เช่น VB6, ASP เป็นต้น สามารถเรียกใช้ Web Service ของ .NET ใด้นั้น จำเป็นที่ต้องลง SDK ที่ชื่อว่า SOAP Toolkit ขณะที่เขียนนี้เป็นรุ่น 2.0 Gold Edition ซึ่ง SDK ตัวนี้มีความสามารถหลายอย่าง แต่บทนี้ผมเน้นเฉพาะ การติดต่อกับ Web Service เท่านั้น

    การที่ใช้ VB6 เป็น Client นั้น ความสะดวกสบายในตอนนี้ คงสู้กับใช้ภาษาของ .NET เป็น Client ไม่ได้ ภาษาของ .NET นั้นเราสามารถใช้โปรแกรมที่ชื่อว่า WebServiceUtil.exe เพื่อทำการสร้าง proxy class การใช้ proxy class นั้นช่วยให้เราทำงานหลายอย่างสะดวกขึ้นเช่น ความสามารถในการทำ IntelliSense เป็นต้น ส่วน Client VB6.0 ที่ใช้ SOAP Toolkit รุ่น 2.0 นี้ ยังไม่มี IntelliSense ใช้ เราต้องเรียกชื่อ Function นั้นตรงๆ ถ้าไม่สำเร็จเราจะรู้ต่อเมื่อลองรันโปรแกรมดูแล้ว

    เรามาเริ่มต้นกันที่แฟ้มข้อมูล ที่เป็น .asmx ก่อน เราต้องมีการปรับปรุงเล็กน้อย เพราะ Web Service ที่เรียกผ่าน SOAP Toolkit นั้นต้องใช้โปรโตคอล SOAP เท่านั้น ดังนั้นเราจึงบังคับให้ .asmx ให้ใช้เฉพาะ SOAP เท่านั้น มิฉะนั้น SOAP Toolkit จะเรียกใช้งานไม่ได้ ผมขอยกตัวอย่างเดิมในบทก่อนๆ ดังนี้ครับ

test.asmx

<%@ WebService Language="C#" class="Addition" %>

using System;
using System.Web.Services;
using System.Web.Services.Protocols;

public class Addition : WebService
{
[ SoapMethod(RequestNamespace="", ResponseNamespace="") ]
[WebMethod] 
public int Add(int x, int y) 
{
return
x + y;
}
}

บรรทัดที่เพิ่มเข้ามากว่าปกติคือบรรทัดที่เป็นสีแดง ในที่นี้คือบรรทัด using 1 บรรทัด และ attribute SoapMethod นั้นต้องมี 1 ตัวต่อ 1 WebMethod ครับ

จากนั้นเรามาลองดู Code ที่เป็น VB6 ครับ (ก่อนเขียนให้ทำ Reference สำหรับ Microsoft Soap Type Library ด้วยก่อนนะครับ)

Dim Serializer As SoapSerializer
Dim Reader As SoapReader
Dim Connector As SoapConnector

Set Connector = New HttpConnector

Connector.Property("EndPointURL") = "http://localhost/test.asmx"
Connector.Connect 

Connector.Property("SoapAction") = "http://ltempuri.org/Add"
Connector.BeginMessage

Set Serializer = New SoapSerializer
Serializer.Init Connector.InputStream

Serializer.startEnvelope "soap"
Serializer.startBody
Serializer.startElement "Add"
  
Serializer.startElement "x"
   Serializer.writeString "5"
   Serializer.endElement

   Serializer.startElement "y"
   Serializer.writeString "6"
   Serializer.endElement

Serializer.endElement
Serializer.endBody
Serializer.endEnvelope

Connector.EndMessage

Set Reader = New SoapReader
Reader.Load Connector.OutputStream


msgbox Reader.RPCResult.xml

เวลาใช้งาน ให้แก้ บรรทัดสีน้ำเงินเป็นที่ๆ เราหา .asm เจอ ส่วนบรรทัดสีเหลืองเป็นการระบุชื่อ Method และ บรรทัดสีเขียวเป็น Parameter ครับ

สำหรับ .NET Framework Beta 2

    ถ้าใครใช้ .NET Framework Beta 2 จะมีวิธีที่สะดวกกว่านี้ครับคือ .asmx นั้นที่เพิ่มสีแดงนั้นไม่ต้องเพิ่มแล้วนะครับ ใช้ได้ตามปกติ ส่วน Client ที่เป็น VB6 ให้เขียนแบบนี้ครับ

Dim s as New SoapClient
s.mssoapinit "http://localhost/test.asmx?wsdl", "", ""
Msgbox s.Add(3, 5)

เวลาใช้งานนั้น ตรง .Add ไม่มี IntelliSense นะครับ

ขอคุยถึงที่มาที่ไปหน่อยว่าทำไมมันถึงใช้งานได้ง่ายขึ้นกว่า Beta1 คืออย่างนี้ครับ วิธีข้างบนที่เราเรียกยุ่งยากนั้นเป็นวิธีที่เราเรียกว่า Low Level ส่วนวิธีที่ง่ายนั้นเป็นวิธีที่เรียกว่า High Level การที่ใช้งาน High Level ได้นั้น Soap Tool kit ต้องการ Description ของ Parameter ทุกตัวว่ามีชนิดอะไรบ้างจะได้ส่งได้ถูก ซึ่งนิยามที่ใช้ส่งกันนั้นเป็นภาษา WSDL นั่นเอง แต่ใน .NET Framework Beta 1 ซึ่งออกมานานแล้วยังไม่สามารถรองรับภาษาดังกล่าวได้ รองรับได้แต่ต้นแบบคือภาษา SDL เท่านั้น  เท่านั้น ดังนั้นเมื่อส่งมาให้ SOAP  จึงอ่านกันไม่รู้เืรื่อง เราจึงต้องเรียกใช้แบบ Low Level แต่ตอนนี้พัฒนาแล้วครับ .NET Beta 2 ยกเลิกภาษา SDL หันมาใช้ WSDL ได้แล้ว เราจึงใช้งานได้ง่ายๆ แบบนี้ครับ