ติดปัญหาการเรียก .net เว็ปเซอร์วิสจาก PHP ครับ (Consuming .Net Webservice from PHP)
คือพอดีว่าผมทำ project จบ ในเรื่องเกี่ยวกับ webservice อ่ะครับ โดยเขียน web service ประมาณ 3 ภาษา และใช้ php ในการเป็นหน้า portal เพื่อแสดงรูปแบบของข้อมูลนะครับ โดยในตอนนี้ผมติดปัญหาในส่วนของการเรียกใช้งาน .net webservice จากหน้า portal(PHP) ครับ ซึ่งในฝั่ง .net เนี่ยผมก็เขียนเว็ปเซอร์วิสที่ใช้ได้จริงแล้วนะครับ เพราะลองทดสอบกับ SoapUI แล้วครับ โดย url ของ wsdl ชื่อนี้ครับ http://localhost:50459/Service1.asmx?WSDL พอไม่สามารถเรียกใช้งานได้ผมก็เลยลองหา .net เว็ป service จากภายนอกมาลองเรียกใช้ดูปรากฏว่าเรียกใช้งานได้ครับ ผมก็เลยงงๆ ว่ามันเกิดอะไรขึ้น ในตอนแรกผมคิดไปว่าน่าจะเกิดจาก namespace ที่ใช้ เพราะใน php มัน gen ออกมาเป็น ns1 แต่เวลาเรียกใน SoapUI มันจะ gen เป็น tem ครับ แต่ก็ไม่ใช่เพราะผมลองปรับ namespace แล้วก็ยังคงเป็นอยู่ครับ ต่อมาผมก็มาดูเรื่องของ header เพราะไม่แน่ใจว่า .net มันจะทำพวก credential ให้เองหรือป่าว แต่ก็ปรากฏว่าไม่ใช่ สุดท้ายผมลองมาเปลี่ยนจาก localhost ให้กลายเป็น 127.0.0.1 ดูเพราะเมื่อก่อนผมเคยมีปัญหากับการสร้างเว็ปเซอร์วิสจาก php และใช้ php เรียกเช่นกัน ซึ่งผลก็คือไม่ได้เช่นกันครับ สุดท้ายผมได้แต่คิดว่าอาจจะเป็นเพราะ localhost หรือป่าว เพราะ php ก็ใช้ localhost และ .net เองก็ใช้ localhost อาจจะทำให้เกิดอะไรสักอย่างที่ผมก็ไม่แน่ใจเหมือนกัน ถ้ายังไงเพื่อนๆ พี่ๆ น้องๆ คนใดที่เคยเขียนในลักษณะอย่างผมนี้แล้วใช้งานได้ปกติรบกวนแนะนำด้วยนะครับ เด๋วผมจะแนบ code ที่ใช้เรียก, code ที่ใช้สร้างตัว service, และ output ให้ดูนะครับ ขอบคุณครับ
Code ที่ใช้เรียก(PHP)
Code (PHP)
<?php
$client = new SoapClient("http://127.0.0.1:50459/Service1.asmx?WSDL",array(
"trace" => 1,
"exceptions" => 0));
$result = $client->CalculateVAT(array('Price' => '1000', 'VATRate' => '7'));
print "<pre>\n";
print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response :\n".htmlspecialchars($client->__getLastResponse()) ."\n";
print "<pre>";
?>
Code ที่ใช้สร้าง Service (.Net)
Code (VB.NET)
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class Service1
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function CalculateVAT(ByVal Price As Decimal, _
ByVal VATRate As Decimal) As Decimal
CalculateVAT = Price * (VATRate / 100)
End Function
End Class
และผลลัพธ์ที่ได้ครับ โดยมัน connect เจอนะครับ เหมือนกับส่ง request ไปแล้วแต่ไม่ได้ response กลับมาครับ
Request :
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:CalculateVAT>
<ns1:Price>1000</ns1:Price>
<ns1:VATRate>7</ns1:VATRate>
</ns1:CalculateVAT>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Response :Tag : PHP, CakePHP, Web (ASP.NET), WebService
Date :
2012-01-07 13:37:28
By :
zubduce
View :
1521
Reply :
5
ผมไม่เคยเขียน .net และไม่ได้เชี่ยวชาญ webservice นะคับ
.net นี่ไม่ต้องมีคำสั่ง return เหมือน ruby เหรอคับ มัน return ให้เองเหรอ ?
เพราะ ไม่เห็นมี การคืนค่า CalculateVAT
Date :
2012-01-07 18:19:06
By :
pjgunner.com
มีการ return แล้วครับ เพราะอันนี้ผมเขียนเป็นลักษณะ function ซึ่ง function นั้นจะต้องมีการคืนค่า 1 ค่าอยู่แล้วครับ ซึ่งก็คือคืนค่าในชื่อ function ของมันแหละครับ โดยผมประกาศไว้ตรงนี้ครับ
Public Function CalculateVAT(ByVal Price As Decimal, _
15.ByVal VATRate As Decimal) As Decimal
โดยจะเห็นว่า Calculate นั้นตอนท้าย code ผมได้ประกาศไว้ว่า As Decimal
ซึ่งปัญหาที่ผมเจอจริงๆ แล้วไม่ใช่เรื่องการ return ค่าแต่อย่างใด เพราะผมได้ทดสอบเรียกผ่าน soapUI ดูแล้ว ซึ่งมันก็คืนค่าที่ถูกต้องครับ แต่ตอนนี้ติดที่เรื่องของการ response ของตัว webservice เท่านั้นครับ โดยในตอนนี้ผมคิดว่าจะลอง deploy ขึ้นตัว IIS ดู เพื่อให้มันได้ url ของมันจริงๆ แล้วจะลองเรียกดูอีกที ว่าจะได้ผลอย่างไรครับ
Date :
2012-01-08 12:28:49
By :
zubduce
ไม่มีไฟล์ wsdl เหรอคับ หรือมันสร้างให้อัตโนมัติ ลองเอามาดูคับ
Date :
2012-01-08 18:29:39
By :
pjgunner.com
ไม่เคยเขียน VB นะครับ แต่ C# ต้องมี return
ลองดูตัวอย่างตามลิ้งนะครับ เป็นการใช้ PHP เรียก WebService ที่เขียนโดย ASP.NET C# โดยใช้ nusoap Library
http://korakitinfo.com/hong/readarticle/80
Date :
2012-01-24 14:17:43
By :
korakitinfo.com
Load balance : Server 02