1

我检测到从 Powershell 脚本调用 WCF 服务的奇怪行为。使用 Powershell 2.0 中的命令“New-WebServiceProxy”让您能够从 PS 脚本向 Web 服务发送请求。但是我在服务端遇到了 System.DateTime 对象的一些问题,服务器端的值始终是DateTime.Min。

所以我创建了一个小型测试服务脚本,我可以重现这个错误。我使用了 VS2010 中的“标准”WCF 项目,并使用 DateTime 属性扩展了“DataContract”类:

[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)

如果需要,我可以向您发送压缩项目的保管箱链接。

问候乌韦

4

1 回答 1

0

我以前从未使用过powershell,但我想我会为这个问题仔细研究一下!

代理对象 $data 可以设置一个日期属性,但是,尽管您的代码看起来像它所做的那样,$data 并不是真正的对象,它只是它的 XML 代理。

如果您输入命令“$data”,您将看到该对象的 XmlSerialized 版本(具有 bool 和 DateTime 的 xxSpecified 属性)。它确实反映了例如“$data.Datum = Get-Date”所做的更改。

当您调用 GetUsingDataContract(作为参数传递并使用 XML 发送)时,代理将反序列化回 MyCompositeType 的实例,您可以通过在调用它之前在属性 get/setter 上放置断点来查看。

作为这种反序列化的一部分,只有 StringValue 才能实现,这是因为其他属性的 Xml 序列化将仅包含“xxxSpecified”为真的值。

如果您在代理中设置“xxxSpecified”属性,它们将正确序列化回来。

但最好的解决方法是将其 DataMember 属性更改为:

[DataMember(IsRequired=true)]

这应该只适用于您拥有的代码。

于 2012-12-13T12:51:37.300 回答