2020年10月27日 星期二

解決WCF服務出現輸入的參數都為空值的狀況

今天被WCF搞到瘋掉 

本來我一直可以用的WebService服務,突然發現傳遞到Service端的String參數都不見了 !

搞了半天搞不定

最後發現一個事實... 

Visual Studio可以用加入服務參考的方式,自動生成所對應的WCF類別,我們就可以快樂的在程式中使用。 

但哪天我發現Service端的某個函數名稱命名不滿意想要更換,於是我將Service1.svc中的某個函式的某個參數名稱改變(例如我將以下的value改成number)
Public Function GetData(ByVal value As Integer) As String Implements IService1.GetData
	Return String.Format("You entered: {0}", values)
End Function
然後發佈了!程式運作正常! 

但想一想IService1.vb下的名稱也要改啊!不改是違反美學的事 

於是我也將IService1的相同函式名稱的參數也改名了(例如將以下的value改成number)
<OperationContract()>
Function GetData(ByVal values As Integer) As String
最後神奇的事情發生了,之後程式無論輸入什麼都是出現You entered:0 !!

原來是我沒有在主程式更新WCF服務,雖然找得到相同的函式名稱,但是找不到完全相同的參數名稱(大小寫也得符合),所以找不到的參數就以預設值處理了。

結論: 每次要release主程式前都請先更新服務參考後再重建一次,已確保WCF服務可運作正常

2020年10月24日 星期六

自從PowerShell v3以後,PSSession是由遠端電腦負責管理,也就是說我們一旦建立了一個PSSession如果不明確Remove-PSSession的話就只能等Idle時間到了後自動結束連線了(預設是2小時)

如果我們要對相同電腦在不同的時間做多件事可以改用Connect-PSSession及Disconnect-PSSession,會比不斷地重新建立連線來的快多了


$server = "SERVER1"
$account = "admin"
$password = "P@ssw0rd"
$pwd = ConvertTo-SecureString -String $password -AsPlainText -Force
$cred = [PSCredential]::new("$server\$account",$pwd) 

# 設定連線名稱
$sessionName = "ABCD123"

# 連線 (連線成功時Availability狀態是Available)
$session = New-PSSession -ComputerName $server -Credential $cred `
                  -Name $sessionName
# 要求遠端電腦執行一些指令
Invoke-Command -Session $session -ScriptBlock {    
    Get-Service | ft
}
# 中斷連線,不然會一直占用直到timeout 
# (中斷後Availability狀態由Available轉成None)
Disconnect-PSSession -Session $session

# 這時就可以用其他電腦使用 
# 恢復連線 (如果其他工作佔用了連線,此時的狀態是Busy,
# 就沒辦法連線了,要等到連線變成None才行)
$session2 = Connect-PSSession -ComputerName $server -Credential $cred `
                      -Name $sessionName
# 做一些事
Invoke-Command -Session $session2 -ScriptBlock {    
    Get-Process | ft
}

# 記得最後需移除連線
Remove-PSSession -Session $session2

2020年10月22日 星期四

使用PowerShell對遠端電腦下指令

在工作中常常需要對遠端電腦下指令, PowerShell內建了方便的指令可以操作,而且是透過5985port運作的


# 以系統管理員身分執行以下指令,只要做一次
# 1. 啟用遠端連線,也可用 winrm --% quickconfig -force
Enable-PSRemoting -Force -SkipNetworkProfileCheck

# 2. 設定TrustedHosts允許連到其他所有電腦,也可用 
#   winrm --% set winrm/config/client @{TrustedHosts="*"}
Get-Item WSMan:\localhost\Client\TrustedHosts | Set-Item -Value "*" -Force

# 3. 設定可執行ps1檔,不是管理員也可以用 -Scope CurrentUser 執行
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser -Force
# =========================================================================
$server = "SERVER1"
$account = "admin"
$password = "P@ssw0rd"
# 明碼轉密碼
$pwd = ConvertTo-SecureString -String $password -AsPlainText -Force
# 設定憑證
$cred = [PSCredential]::new("$server\$account",$pwd) 
# 連線
$session = New-PSSession -ComputerName $server -Credential $cred
# 要求遠端電腦執行一些指令,可用-ArgumentList輸入額外參數
Invoke-Command -Session $session -ScriptBlock {    
    Get-Service -Name $args[0],$args[1]
} -ArgumentList "a*","b*"
# 移除連線
Remove-PSSession -Session $session

2020年10月21日 星期三

在.Net Core的主控台應用程式使用MessageBox

今天開始要將一些學習筆記記錄下來。

 我終於開始嘗試使用.Net Core 3.1了,本來想說應該和.Net framework差不多,但是卻連Hello World都出不來!

試了半天終於搞定!

1. Visual Studio 2019在主控台專案按兩下左鍵,叫出.vbproj檔



2. 將第一行的SDK改成 Microsoft.NET.Sdk.WindowsDesktop,並在PropertyGroup下增加
<UseWindowsForms>true</UseWindowsForms>

3. 於是就可以顯示出來啦!

這是第一篇文章,真是可喜可賀!

解決WCF服務出現輸入的參數都為空值的狀況

今天被WCF搞到瘋掉  本來我一直可以用的WebService服務,突然發現傳遞到Service端的String參數都不見了 ! 搞了半天搞不定 最後發現一個事實...  Visual Studio可以用加入服務參考的方式,自動生成所對應的WCF類別,我們就可以快樂的在程式中使用...