今天下班前,客戶來閒聊最近行內週邊系統發生的一個未知原因應用程式問題,問題發生在powershell呼叫webservice,自己以前沒試過從Powershell呼叫webservice,晚上刷好Apple Pay賺500哩之後來試試。
實驗的步驟分成兩個部分,分別是建立WebService以及從Powershell呼叫WebService。
建立WebService
1.新增一個VisualStudio網站專案: PS2Webservice,新增一支WebService程式: AirlinesService.asmx
2.新增兩個Web Method
第一個方法回傳常搭乘的航空公司;第二個方法輸入ISO國家別參數後,若為日本回傳1,000哩,其他回傳2,000哩。
[WebMethod]
public string[] GetAirlines()
{
return new string[3] { "CI:中華航空", "BR:長榮航空", "CX:國泰航空" };
}
[WebMethod]
public int GetMiles(string Country)
{
if (Country.Equals("JP"))
{
return 1000;
}
else
{
return 2000;
}
}
3.啟動網站
AirlinesService
OK,Webservice環境準備好了,接下來寫powershell。
從Powershell呼叫WebService
1.打開Powershell ISE
2.輸入以下指令,先查詢取得服務內方法。
$service = New-WebServiceProxy -Uri "http://localhost:47991/Service/AirlinesService.asmx?WSDL"
$service | Get-Member -MemberType method
選取後,按F8執行,執行結果:
3.查看$service物件,還有智慧提示(Intellisense)可以選取方法
這次先查詢常搭乘的航空公司
按F8執行,結果:
4.接下來試試要輸入參數的,同時指定class名稱:AirlinesService
$URI = "http://localhost:47991/Service/AirlinesService.asmx?WSDL"
$Prox = New-WebServiceProxy -Uri $URI -Class "AirlinesService"
$Prox.GetMiles("JP")
按F8執行,結果:
5.跑簡單的迴圈及判斷式
For ($i = 1; $i -le 10 ;$i++) {
if ($i -le 5)
{
$Prox.GetMiles("JP")
}
else
{
$Prox.GetMiles("")
}
}
按F8執行,結果:
客戶說明程式的流程是逐筆呼叫Webservice,powershell程式取回資料然後更新DB,當執行太快時會發生查無物件的異常(疑,印象中呼叫過多webservice有點可疑),但改成每筆之間等待0.5秒後,全數都可以正常過關。
目前收到的訊息還不足,姑且就是:
水星逆行:
明天再和客戶厲害的.NET架構師一起討論。
參考: