顯示具有 Web Service 標籤的文章。 顯示所有文章
顯示具有 Web Service 標籤的文章。 顯示所有文章

2009年7月5日 星期日

使用nusoap建立web service-範例

首先 分別撰寫cliet與server端程式,放在nusoap資料夾下

server端部分程式碼撰寫原則:
  1. 撰寫欲被client調用的函式connectandsave($content)
  2. 引入nusoap require_once("lib/nusoap.php");
  3. 建立soap_server實體 new soap_server()
  4. 配置WSDL文件敘述 configureWSDL
  5. 為服務註冊register方法函式(connectandsave)
  6. 使用service方法執行方法並回傳值 $server->service($POST_DATA);

server端-WSservertest.php:
<?php
//定義service處理函式
function connectandsave($content)
{
$xx = main::toStore($content);

return "get \r\n" . main::$accuracy2 . "\r\n" ;
//return "get \r\n" . $content . "\r\n" ."dd";

}
date_default_timezone_set("Asia/Taipei");
require_once("lib/nusoap.php");


$server = new soap_server();// 初始化一個service物件實體
$server->soap_defencoding='UTF-8';
$server->decode_utf8=false;
$server->configureWSDL("SimpleService");// 配置 WSDL 描述,叫用時以此為類別名稱
$server->wsdl->schemaTargetNamespace = $namespace; // set namespace
// register service's WebMethod,註冊過的程序才能被訪問到
// $server->register('answerHello',array('name' => 'xsd:string'),array('return' => 'xsd:string'));
$server->register(
// method name:
'connectandsave',
// parameter list:
array('name'=>'xsd:string'),
// return value(s):
array('return'=>'xsd:string'),
// namespace:
$namespace,
// soapaction: (use default)
false/*,
// style: rpc or document
'document',
// use: encoded or literal
'encoded',
// description: documentation for the method
'Anser Hello to World '*/);


//把client端 post 過來的資料,傳給server物件的 service 方法處理。
//service 方法處理的資料會借調用相應的函式回傳給叫用端
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA'])
? $GLOBALS['HTTP_RAW_POST_DATA'] : '';

$server->service($POST_DATA);
exit();
?>

其中main是自定類別,裡面就是自己寫的一些程序

接下來示範如何調用剛剛寫好的函式connectandsave
client端部分程式碼撰寫原則:
  1. 引入nusoap require_once("lib/nusoap.php");
  2. 建立soapclient()實體 new soapclient()
  3. 將要傳送的資料陣列化(array)
  4. 使用call方法叫用欲呼叫的方法call(函式名)
  5. 印出call完後的值;


client端-WSclienttest.php :
<?php
require_once("lib/nusoap.php");
//初始化 client 物件,是class soapclient 的一個實體
//把服務程序的 URL 地址傳遞给soapclient類別的構造函式
$client = new soapclient('http://xxxx/nusoap/WSservertest.php'); //後面利用client物件的 call 方法調用 WEB 服务的程序'GPSconnectandsave'

$myname = 'clark' ;
// $Content = '25.07433874,121.52545941,2009-05-23,17:53:56,1.2,5,2.3,2.6,8.3,xxx' ; //中原國小門口
$Content = '24.956846,121.242451,2009-05-23,17:53:56,1.2,5,2.3,2.6,8.3,xxx' ; //中原大草皮

$parameters=array('24.956846,121.242451,2000-01-01,17:53:56,1.2,5,2.3,2.6,8.3,xxx');
$str=$client->call('connectandsave',$parameters); //call('函式名',匹配的參數) 函式名為在WSservertest.php中所註冊的函式

//$str=$client->call('hello'); //客户端对象的 getError() 方法可以用来检查调用过程是否出现错误。
//如果没有错误, getError() 方法返回 false ;如果有错误, getError()方法返回错误信息。
if (!$err=$client->getError()) {
echo " return:",htmlentities($str,ENT_QUOTES); //the optional second quote_style parameter lets you define what will be done with 'single' and "double" quotes. It takes on one of three constants with the default being ENT_COMPAT: ,ENT_QUOTES Will convert both double and single quotes.
} else {
echo " error :",htmlentities($err,ENT_QUOTES);
}

//觀察request 和 response響應
echo '<p/>';
echo 'Request:';
echo '<pre>',htmlspecialchars($client->request,ENT_QUOTES),'</pre>';
echo 'Response:';
echo '<pre>',htmlspecialchars($client->response,ENT_QUOTES ),'</pre>';

?>

2009年5月21日 星期四

使用NuSOAP建構webservice

NuSOAP的使用说明

NuSOAP教程

http://www.phpq.net/tag/NuSOAP/

http://www.shanghuo.net/?action=show&id=51

使用C#叫用PHP寫的webservice
http://www.sanity-free.org/125/php_webservices_and_csharp_dotnet_soap_clients.html

php SOAP 簡單的示範

2009年3月25日 星期三

ASP.NET權限不足,無法使用WINDOWS應用程式

最近遇到了個問題
撰寫了一個web service掛載於IIS下,web service會透過SKYPE API呼叫本機電腦裡面的應用程式(SKYPE)作發送簡訊的功能。

未發行至IIS下叫用都是正常的,也寫了一個windows form 來叫用確認是可以執行的
但一發布到IIS下,偵錯時卻發生了.. client端程式 出現wait timeout..

開啟web service 偵錯模式,再來看看web service怎說~
web service先參考skype4com.dll,在程式裡new skypeclass()實體為 myskype都OK,下一步
myskype.sendSMS("+886xxxxxxxxx","hello","") 馬上消失,就像正在處理工作一樣程式碼沒有反紅,看不到偵錯情形。
利用try and catch把runtime error抓出來,錯誤顯示
System.Runtime.InteropServices.COMException (0x80040200): Not attached.
於 SKYPE4COMLib.SkypeClass.SendSms(String TargetNumbers, String MessageText, String ReplyToNumber)
於 Service.HelloWorld() 於 c:\Inetpub\wwwroot\WSsendSKYPE2\App_Code\Service.cs: 行 70

怪哉~GOOGLE了很久,沒有一個解決的方法~
問題可能出在"安全性"問題上~
ASP.NET預設使用者使用資源的安全性與windows應用程式預設安全性不同,所以才會有掛載在IIS下的webservice與windows form使用SKYPE.EXE權限不同!

MSDN tech提到安全性原則部分
有兩個步驟:
1.讓ASP.NET使用者權限提到最高,可以執行、讀取、寫入等等
2.讓SKYPE檔案降低權限可以被設定的使用者群組執行、讀取等

之後再在web service程式碼裡頭加上
System.Diagnostics.Process.Start("Skype.exe"); 允許讀取到此執行檔


System.Diagnostics.Process.Start("Skype.exe");
錯誤顯示 :
{"System.Web.Services.Protocols.SoapException: 伺服器無法處理要求。 ---> System.ComponentModel.Win32Exception: 系統找不到指定的檔案。\n 於 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)\n 於 System.Diagnostics.Process.Start()\n 於 System.Diagnostics.Process.Start(ProcessStartInfo startInfo)\n 於 System.Diagnostics.Process.Start(String fileName)\n 於 Service..ctor() 於 c:\\Inetpub\\wwwroot\\WSsendSKYPE2\\App_Code\\Service.cs: 行 15\n --- 內部例外狀況堆疊追蹤的結尾 ---"}

挖哩,還是讀取不到~>~<~ 不知道是使用者群組原則是否沒有設定好,但我已經把權限都改成"完全控制"了呀?! 之後也試過了web.config 組態設定,還沒試"註冊表"修改~畢竟如果轉移網站的話,不好意思把別人的系統弄掛吧>< 如果web service 可以叫用額外寫的windows form(APP1),而APP1可以使用SKYPE API進行發送簡訊,這樣也許可以完成。只要APP1的路徑掛在IIS下,但不成為ASP.net的成員。不知道這樣的觀念有沒有錯~ 終於找到了這個想法的實現方式~"遠端物件"~~~~~ 利用.net framwork 提供的 remoting namespace把windows application當作遠端物件使用~ 依然要考慮到使用者群組安全性原則~ 但是..這又是一個大議題..依目前程度要花不少時間來看。 想著這個方法的可行性入睡~~~ 也許有另一個方式會比較間接,但可行性有9成!! 利用資料庫當作媒介,讓WEB SERVICE作寫入,另一隻程式做讀取判斷來執行SKYPE 一樣另外寫一個windows application,這隻程式不斷讀取資料庫作判斷。 這樣一來,windows application是在系統管理者的權限下執行而可以使用SKYPE API 再者,移動網站時,也不需要考慮到路徑的問題,只需要多安裝這個application了~ 但,這畢竟是較低級的方法,application 會不斷使用系統資源,還是使用event觸發的方式較能節省系統資源。

2009年3月10日 星期二

webservice 傳送問題

傳輸時,發生

用戶端找到的回應內容型別為'text/html; charset=iso-8859-1',但需要的是'text/xml'。

解:
如果您檢視錯誤訊息的內容,會發覺這個 HTML 網頁是您瀏覽 .ASMX 檔案時所見到的。這時會產生一個疑問:當我將 XML (SOAP Envelope 的格式) 公佈到 Web 服務時,為什麼會傳回 HTML?結果就是您沒有使用 SOAP Envelope 傳送 HTTP POST 要求,卻只是傳送沒有本文的 HTTP GET 要求,而 Web 服務會適當地假設您是瀏覽器,並傳回它一般的 HTML 回應。

refer
http://www.microsoft.com/taiwan/msdn/library/2002/Sep-2002/service08062002.htm

2009年2月23日 星期一

webservice使用

逐步解說:使用 Visual Basic 或 Visual C# 存取 XML Web Service


遵循步驟,取代使用PDA windows應用程式範本


並且新增一行程式碼

ws.Url = "http://XXX.XXX.XXX.XXX/webservice所處位置/方法代理名稱";

新增程式碼



模擬器手機顯示



如何開啟模擬器PDA 網路連線呢??

目前還不知道怎麼連,但佈署到手機上啟用3G連線是沒問題的

2009年2月22日 星期日

webservice V2

逐步解說:使用 Visual Basic 或 Visual C# 建立 XML Web Service
包含4個部分,第三部分之前有提過,就不在這說了
  • 使用 ASP.NET Web 服務專案範本,建立 XML Web Service。
  • 實作 XML Web Service。
  • 在偵錯模式下執行 XML Web Service。
  • 部署 XML Web Service。
step1. 增加程式碼描述位置資訊


增加方法函式
step2. 增加專案->WEB安終佈署。建置WEB安裝程式


step3. 與PDA佈署應用程式建立相同

點擊新建的安裝程式專案 右鑑,輸出!!
step4.


到這裡就建置完成了~~

逐步解說:使用 Visual Basic 或 Visual C# 存取 XML Web Service

2009年2月17日 星期二

web service 建置與使用

遵循書上範例建立web service ,建立完成後都繪有個基本的web method ==> helloword()
當按下執行紐,就會跳出兩個選項
  1. 建立web.config 以提供偵錯功能
  2. Ctrl+F5略過偵錯來執行
如果選擇1就會跳出下列錯誤



解決辦法參考 (MSDN)錯誤:偵錯失敗,因為整合式 Windows 驗證沒有啟用

啟用驗證後的執行偵錯畫面







參考資料 MSDN驗證與授權
這份資料也值得一看
~關於ASP.net管理工具的東西