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)

必要に応じて、zip形式のプロジェクトのドロップボックスリンクを送信できます。

よろしくUwe

4

1 に答える 1

0

私はこれまでPowerShellを使用したことがありませんが、この質問については、長い間延期されていると思いました。

プロキシオブジェクト$dataにはdateプロパティを設定できますが、コードの動作にかかわらず、$ dataは実際のオブジェクトではなく、そのXMLプロキシにすぎません。

コマンド「$data」を入力すると、オブジェクトのXmlSerializedバージョンのように見えることがわかります(boolおよびDateTimeのxxSpecifiedプロパティがあります)。たとえば、「$ data.Datum=Get-Date」によって行われた変更を反映します。

GetUsingDataContractを呼び出すと(パラメーターとして渡され、XMLを使用して送信されるため)、プロキシはMyCompositeTypeのインスタンスに逆シリアル化されます。これは、呼び出す前にプロパティget/settersにブレークポイントを設定することで確認できます。

この逆シリアル化の一部として、StringValueのみがそれを作成します。これは、他のプロパティのXmlシリアル化には、「xxxSpecified」がtrueの値のみが含まれるためです。

プロキシで「xxxSpecified」プロパティを設定すると、正しくシリアル化されます。

ただし、最善の修正は、DataMember属性を次のように変更することです。

[DataMember(IsRequired=true)]

これはあなたが持っているコードでうまくいくはずです。

于 2012-12-13T12:51:37.300 に答える