2012-12-13 23 views
1

我檢測到一個奇怪的行爲,從Powershell腳本調用WCF服務。使用Powershell 2.0中的命令「New-WebServiceProxy」可以讓您從PS腳本向Web服務發送請求的能力。但是我在服務端的System.DateTime對象中遇到了一些問題,服務器端的值是總是 DateTime.Min。Powershell WCF服務DateTime屬性始終DateTime.Min(01.01.0001)

所以我創建了一個小測試服務的腳本,我可以重現這個錯誤。我用了一個「標準」的WCF項目從VS2010和extedended的「DataContract」類具有一個DateTime屬性:

[DataContract] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string stringValue = "Hello "; 

    [DataMember] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string StringValue 
    { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 

    [DataMember] 
    public DateTime Datum { get; set; } 
} 

PowerShell腳本調用服務:

cls 
$serv = New-WebServiceProxy -uri 'http://localhost:50176/TestService.svc?wsdl' -  Namespace wt 
$data = [wt.CompositeType](New-Object wt.CompositeType) 
$data.StringValue = "abcd" 
$data.BoolValue = $true 
$data.Datum = Get-Date 
$serv.GetDataUsingDataContract($data) 

如果需要的話,我可以給你是一個壓縮項目的Dropbox鏈接。

問候烏韋

回答

0

我從來沒有使用PowerShell的之前,但認爲我會需要很長的逾期看看它對於這個問題!

代理對象$ data可以有一個日期屬性集,但儘管代碼看起來像它,但$ data不是真正的對象,只是它的XML代理。

如果您輸入命令「$ data」,您將看到什麼看起來像對象的XmlSerialized版本(具有bool和DateTime的xxSpecified屬性)。它確實反映了由「$ data.Datum = Get-Date」。

,當你調用GetUsingDataContract的代理deserialised回MyCompositeType的實例(其作爲參數傳遞,並使用XML發送),你可以通過把斷點上之前調用它的屬性的get/setter方法見。

作爲這種反序列化的一部分,只有StringValue纔會生成這種情況,這是因爲其他屬性的Xml序列化將只包含「xxxSpecified」爲true的值。

如果您在代理中設置了「xxxSpecified」屬性,它們將正確序列化回去。

但最好的解決方法是他們的數據成員屬性更改爲:

[DataMember(IsRequired=true)] 

這應該只是你已經得到了代碼工作。

+0

我試過xxxSpecified解決方案,它的工作完美。感謝你及時的答覆。 – uernst