เว็บเซอร์วิส (Webservice)
เว็บเซอร์วิส (Webservice) (เอกสาร Microsoft Word)
เว็บเซอร์วิส คือ แอพพลิเคชั่น (Application) หรือฟังก์ชัน (Function) หรือ ซอฟต์แวร์คอมโพเนนต์ (Software Component) ที่ถูกสร้างขึ้น เพื่อรอรับการเรียกใช้งานจากแอพพลิเคชั่นในอินเทอร์เน็ต หรือการให้บริการระหว่างเครื่องบริการในอินเทอร์เน็ต มีการสื่อสารด้วยข้อมูลที่อยู่ในรูปแบบเอ็กเอ็มแอล (XML = eXtensible Markup Language) ตามมาตรฐานโซป (SOAP = Simple Object Access Protocol คือ ระเบียบวิธีการสำหรับแลกเปลี่ยนข้อมูล XML ระหว่างเครื่องคอมพิวเตอร์ในอินเทอร์เน็ต)
ความหมายของ Webservices ( petefreitag.com | narisa.com/blog/patrickz/ )
We will compare and contrast three methods of consuming and producing web services: XML-RPC, SOAP and REST
1. XML-RPC __ Remote Procedure Calls are used to establish and facilitate transactions between two remote systems. Example of popular RPC implementations include DCOM and CORBA. XML-RPC is an established implementation of RPC that allows you to transport XML encoded data between two servers using HTTP.
2. SOAP __ SOAP is designed as an XML wrapper for web services requests and responses. SOAP's strength lies in its use of namespaces, XML Schema datatypes, and its flexibility with regard to transports. The disadvantage of SOAP is the fact that the specs and implementation is more complex, especially when you compare it to the simple XML-RPC approach. SOAP is the bread and butter of corporate web service developers. It has been deeply integrated into Microsoft .NET and IBM WebSphere. Based on its popularity, Google and Amazon.com have both created SOAP-based Web services.
3. REST __ REST differs a great deal from SOAP and XML-RPC. First, it's not a standard, whether formal or informal. Second, there is no standardized toolkit or pre-built client and server classes in PHP. The strength of REST is that you won't need special extensions or tools to develop web services. The HTTP protocol specifications contains everything you would need to transmit and receive XML messages.
REST, which stands for "Representational State Transfer", is a simpler approach than XML-RPC or SOAP, using standard HTTP methods such as GET, POST and PUT to send and retrieve XML data. You can then use tools like PHP DOM, SAX, or even XSL to do the parsing. The downside is that everything has to be built by hand (though REST toolkits and frameworks are starting to appear in some languages). If you want to develop REST web services, you must thoroughly understand XML and HTTP. Expect to have to write a little more code yourself.
WSDL ที่บริการในอินเทอร์เน็ต
+ CurrencyConvertor.asmx
+ BibleWebservice.asmx
? https://rdws.rd.go.th

1. การสร้างบริการเว็บเซอร์วิสแบบออนไลน์ ด้วย Visual Studio .NET (อ้างอิงจาก aspnetthai.com)
1. เข้า Visual Studio .net และเลือก Create Web Site..
2. เลือก ASP.NET Web Service จะได้ Source code ดังนี้
    Imports System.Web
    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    <WebService(Namespace:="http://tempuri.org/")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Public Class Service
         Inherits System.Web.Services.WebService
        <WebMethod()> Public Function HelloWorld(ByVal a As Integer) As String
            Return "Hello World"
        End Function
    End Class
3. เมื่อทดสอบประมวลผลจะขึ้น open IE : http://localhost:2273/WebSite1/Service.asmx อัตโนมัติ
4. แสดงว่าเปิดบริการ เว็บเซอร์วิส มีฟังก์ชันชื่อ HelloWorld() ได้แล้ว ตัวอย่างนี้มี Random Port ที่ได้คือ 2273
5. เข้าห้อง "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe"
6. DOS>wsdl http://localhost:2273/WebSite1/Service.asmx?WSDL จะได้แฟ้ม service.cs ขนาด 4,280 Bytes
7. copy service.cs ไปไว้ในห้อง C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ และให้ cd เข้าห้องดังกล่าว
8. สั่งแปลซีชาร์ปด้วย DOS>csc /out:Service.dll /t:library /r:System.dll /r:System.Web.Services.dll Service.cs
9. ได้แฟ้ม service.dll ขนาด 6144 Bytes ให้ copy service.dll ไปไว้ที่ C:\website1\bin
10. เขียนโปรแกรมชื่อ x.aspx ไว้ในห้อง C:\website1
    <%@ Import Namespace="service" %>
    <%
    
    Dim a As New service
    Response.Write(a.HelloWorld() & ".") %>
11. เปิด http://localhost:2273/WebSite1/x.aspx จะพบคำว่า Hello World.

2. การนำ Webservice ที่สร้างขึ้น ไปใช้ใน Windows Application
1. ถ้าเปิด Web service แบบชั่วคราว ก็ให้เปิด Visual Studio ใหม่เพื่อสร้าง Application ใหม่
1. Create WindowsApplication1 ใน Menu Bar, Project, Add Web Reference..
2. สามารถเลือก Web services ที่บริการอยู่ได้ 1 ใน 3 วิธี
2.1 Web services in this solution
2.2 Web services on the local machine
- กรอก URL: http://localhost:1030/WebSite1/Service.asmx
- จะได้คำว่า localhost ในช่อง Web reference name แล้วกด Add reference
- ผลการ Add จะได้ Web reference เพิ่มเข้ามาใน Solution Explorer
2.3 Browse UDDI (Universal Description, Discovery and Integration) Servers on the local network.
3. สร้าง textbox1 ในฟอร์ม และเรียกใช้ web service ใน form1_load
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       Dim a As New localhost.Service
       TextBox1.Text = a.HelloWorld()
    End Sub

3. ตัวอย่าง การสร้าง web service และใช้งานใน Website อย่างง่าย 1 DOS>copy "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe" C:\website1 2 DOS>cd C:\website1 3 DOS>wsdl http://localhost:1047/WebSite1/Service.asmx?WSDL
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\WebSite1\Service.cs'. 4 DOS>copy Service.cs C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ 5 DOS>cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ 6 DOS>csc /out:Service.dll /t:library /r:System.dll /r:System.Web.Services.dll Service.cs 7 DOS>mkdir C:\website1\bin 8 DOS>copy Service.dll C:\website1\bin
<%@ Import Namespace="service" %>
<%
Try
Dim a As New Service
Response.Write(a.HelloWorld())
Catch ex As Exception
End Try
%>
โปรแกรมนี้อาจ error เพราะสร้าง wsdl ผ่าน http://localhost:1047 จึงใช้ไม่ได้

4. ตัวอย่าง การสร้าง web service เชื่อมต่อข้อมูลกับ MYSQL ODBC
x.asmx คือ แฟ้มที่บริการ web service
    Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.Data.Odbc <WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService <WebMethod()> _ Public Function listuserpassword(ByVal u As String) As String Dim connstr As String = "DRIVER={MySQL ODBC 3.51 Driver};" & _ "SERVER=127.0.0.1;DATABASE=mysql;UID=admin;PASSWORD=p;OPTION=3" Dim conn As New OdbcConnection(connstr) conn.Open() Dim cmd As New OdbcCommand cmd.Connection = conn cmd.CommandText = "select user,password from user where user='" & u & "'" Dim s As String = "" Dim r As OdbcDataReader = cmd.ExecuteReader() While r.Read() s &= r(1) & Chr(10) End While conn.Close() Return s End Function End Class

x.aspx คือ แฟ้มที่เรียกใช้ web service
    <%@ Import Namespace="service" %> <% Try Dim a As New Service Response.Write(a.listuserpassword("101")) Catch ex As Exception End Try %>

5. ทดสอบ webservices ในอินเทอร์เน็ต (webservicex.net)
- ทดสอบกับ webservices.net ได้แฟ้ม CurrencyConvertor.cs ขนาด 10,528 Bytes
- ตัวอย่าง currencyconvertor.aspx และ biblewebservice.aspx
    5.1 การแปลงหน่วยแลกเปลี่ยนเงิน (สั่ง wsdl หลายครั้ง กว่าจะเชื่อมต่อสำเร็จ ก็ได้ในครั้งสุดท้าย)
      cd C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin wsdl http://www.webservicex.net/CurrencyConvertor.asmx?WSDL dir CurrencyConvertor.cs copy CurrencyConvertor.cs %windir%\Microsoft.NET\Framework\v2.0.50727\ cd %windir%\Microsoft.NET\Framework\v2.0.50727\ csc /out:CurrencyConvertor.dll /t:library /r:System.dll /r:System.Web.Services.dll CurrencyConvertor.cs
    แล้วคัดลอกแฟ้ม CurrencyConvertor.dll ไปไว้ในห้อง Bin 5.2 ข้อมูลใน bible GetBibleWordsByChapterAndVerse
      cd C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin wsdl http://www.webservicex.com/BibleWebservice.asmx?WSDL dir BibleWebservice.cs copy BibleWebservice.cs %windir%\Microsoft.NET\Framework\v2.0.50727\ cd %windir%\Microsoft.NET\Framework\v2.0.50727\ csc /out:BibleWebservice.dll /t:library /r:System.dll /r:System.Web.Services.dll BibleWebservice.cs
    แล้วคัดลอกแฟ้ม BibleWebservice.dll ไปไว้ในห้อง Bin
      Classic ASP มีตัวอย่างที่ http://www.thaiabc.com/aspnet/biblewebservice.aspx <%@ Import Namespace="BibleWebservice" %> <% Dim c As New BibleWebservice dim txt as String txt = c.GetBibleWordsByChapterAndVerse("Exodus",1,1) response.write(txt) txt = c.GetBibleWordsByChapterAndVerse("Exodus",1,2) response.write(txt) response.write(c.GetBibleWordsByChapterAndVerse("Exodus",1,3)) response.write(c.GetBibleWordsByChapterAndVerse("Exodus",1,4)) %>

99. ตัวอย่างที่ทดสอบแล้ว พบภายหลังว่าบริการที่เคยทดสอบ ถูกปิดไปแล้ว

99.1. ตัวอย่าง จาก http://samples.gotdotnet.com (เว็บไซต์ shutdown ไปแล้ว)
1 DOS>cd "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\"
2 DOS>wsdl http://samples.gotdotnet.com/.../MathService.asmx?WSDL
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\MathService.cs'. 3 DOS>copy MathService.cs C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ 4 DOS>cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ 5 DOS>csc /out:MathService.dll /t:library /r:System.dll /r:System.Web.Services.dll MathService.cs 6 DOS>mkdir C:\website7\bin 7 DOS>copy mathservice.dll C:\website7\bin
    Imports System
    Imports System.Web.Services
    Public Class MathService : Inherits WebService
       <WebMethod()> Public Function Add(a As Integer, b As Integer) As Integer
           Return(a + b)
       End Function
    End Class
    <%@ Import Namespace="mathservice" %>
    <%
        Dim a As New MathService
        Response.Write(a.Add(1, 2))
    %>

99.2. ตัวอย่าง การเรียกใช้ webservice ของกรมสรรพากร
+ Client Certificate http://www.rd.go.th/webservice/new/certificate_291150.cer
+ Information http://www.rd.go.th/webservice/new/tin.html
+ URL OF WSDL https://rdws.rd.go.th/ServiceRD/CheckTINPINService.asmx?WSDL
+ to setup Certificate http://support.microsoft.com/kb/307267
1. Repeat the preceding first 2 steps, click Download CA certificate, and then save it to a file on your local computer. 
2. Start mmc.exe. 
3. Click Console, and then click Add/Remove Snap-in. 
4. In the Add/Remove Snap-in dialog box, click Add.  
5. In the Add Standalone Snap-in dialog box, click Certificates, and then click Add. 
6. Click Computer Account, and then click Next. 
7. Click Local Computer, and then click Finish. 
8. The list of certificate categories for the local computer should appear in the snap-in window. 
9. Click OK to return to the Console Root window. 
10. In the tree view, open the list of trusted root certificate authorities. 
11. To add the certificate authority certificate that issued your server certificate 
to the list, click Action, click All Tasks, and then click Import, or drag the certificate on to the list. 

99.3 สร้าง proxy.bat จะได้สร้าง CheckTINPINService.dll ได้ง่าย
+ ถ้าแฟ้ม .aspx เป็นห้องใด ก็ให้เปลี่ยน C:\website9 เป็นห้องนั้น
+ 530117 : พบปัญหาตอนใช้ wsdl ว่า The remote certificate is invalid according จึงไม่ได้แฟ้ม .cs ครับ rem proxy.bat set curdir=C:\website9 cd "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\" wsdl https://rdws.rd.go.th/ServiceRD/CheckTINPINService.asmx?WSDL copy CheckTINPINService.cs %windir%\Microsoft.NET\Framework\v2.0.50727\ cd %windir%\Microsoft.NET\Framework\v2.0.50727\ csc /out:CheckTINPINService.dll /t:library /r:System.dll /r:System.Web.Services.dll CheckTINPINService.cs mkdir %curdir%\bin copy CheckTINPINService.dll %curdir%bin cd %curdir%
99.4. ตัวอย่าง Code ส่วนหนึ่งของแฟ้ม .aspx <%@ Import Namespace="CheckTINPINService" %> <% Dim DS As New Data.DataSet() Dim a As New CheckTINPINService ' ServicePIN("username", "password", "PIN") DS = a.ServicePIN("anonymous", "anonymous", 3520300266740) Dim I, j, k As Integer Dim s As String = "" For I = 0 To DS.Tables.Count - 1
For j = 0 To DS.Tables(I).Rows.Count - 1
For k = 0 To DS.Tables(I).Columns.Count - 1
s &= DS.Tables(I).Rows(j).Item(k) & " "
Next
s &= "<br>"
Next Next Response.Write(s) ' E00002 ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้องหรือไม่มีสิทธิในการเรียกใช้ Service Username or Password are invalid ' 3520300266740 True W00000(การทำงานเสร็จสมบูรณ์) Success
แนะนำเว็บ (Web Guides)
+ http://truehits.net/faq/webmaster/webservice/
+ http://www.w3schools.com/webservices/ws_example.asp
+ http://code.google.com/intl/th/apis/soapsearch/api_faq.html#gen1
+ http://www.rd.go.th/webservice/
+ http://www.successmedia.com/dl/pd_339_ASP_30.pdf
' Source code : services.cs
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
     Inherits System.Web.Services.WebService
    <WebMethod()> _
    Public Function HelloWorld(ByVal a As Integer) As String
        Return (a * 2)
    End Function
End Class
Code ที่มีมาตอนสร้าง Web Service สามารถนำมาปรับปรุง หรือเพิ่ม function ได้
<form target="_blank" 
action='http://localhost:1066/WebSite3/Service.asmx/HelloWorld' 
method="POST"> 
<input name=a value=5 />
<input type="submit" value="Submit" class="button">
</form>
ฟอร์มส่งค่าให้กับ Web Service แสดงผลลัพธ์เป็น XML อย่างถูกต้อง
Web Form
Add Web Reference ...
myhello
ต้อง Add Web Reference เพื่อให้เกิด Namespace จะได้ import เข้ามาใช้ใน ASP.NET ได้
<%@ Import Namespace="myhello" %>
<%
    Dim x As New Service
    Response.Write(x.HelloWorld(5))
%>
ผลการทดสอบสั้น ๆ ที่ส่งค่า และรับคืนจาก web service
<%@ Import Namespace="myhello" %>
<body>
<form runat=server>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<%
    Dim x As New Service
    If (Len(TextBox1.Text) > 0) Then
        Try
            Response.Write(x.HelloWorld(TextBox1.Text))
        Catch ex As Exception
            Response.Write("exception")
        End Try
    End If
%>   
</form>
</body>
ส่งค่าจาก textbox ให้กับ webservice
<WebMethod()> _
Public Function HelloWorld(ByVal a As Integer) As String
Dim strdb As String = "C:\dthai97.mdb"
Dim strconn As String = provider=microsoft.jet.oledb.4.0;data source=" & strdb
Dim strsql As String
Dim cn As New System.Data.OleDb.OleDbConnection(strconn)
Dim cm As New OleDbCommand(strsql, cn)
Dim dr As OleDbDataReader
Dim s As String = ""
strsql = "select fid,fname,fsalary from tbthai"
cm = New OleDbCommand(strsql, cn)
cn.Open()
dr = cm.ExecuteReader()
Dim c As Integer = 0
While dr.Read()
  c = c + dr.Item(2)
End While
cn.Close()
Return (c)
End Function
code แสดงการเชื่อมต่อกับฐานข้อมูล

http://goo.gl/72BPC