7

Powershell を使用して、コマンド ラインからいくつかの WCF Web サービスに ping を実行しようとしています。例えば

私はWCFオペレーションを持っています

[OperationContract]
string DoWork(string name);

そして、Powershell を使用してそれを呼び出すことができます。

$proxy = New-WebServiceProxy -Uri 'http://localhost/TestService/Service.svc'
$proxy.DoWork('Hello World')

入力パラメーターと戻り値の型が文字列である限り、これは正常に機能します。ただし、整数を導入すると、生成されたメソッド シグネチャと戻り値の型に追加の paramSpecified プロパティが生成されます。

データ コントラクトの戻り値の型を持つ次のメソッドを検討してください。

[DataContract]
public class SimpleClass
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Count { get; set; }
}

... 

[OperationContract]
SimpleClass DoWorkD(string name, int howMany);

問題1

メソッドの署名が間違っていて、余分なパラメータがありますbool howManySpecified

$proxy = New-WebServiceProxy -Uri 'http://localhost/TestService/Service.svc'
$method = $proxy | Get-Member -Name DoWorkD
$method.Definition

Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy3alhost_TestService_Service_svc.SimpleClass, -nv8lxgh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null DoWorkD(string name, int howMany, bool howManySpecified)

問題 2

DataContract クラスの返されたプロキシには、XXXSpecified文字列以外のプロパティの追加のプロパティもあります。

______________________________________________________________________
PS D:\Work\Sandbox\Powershell> $proxy.DoWorkD("Hello World", 10, $true")

Count       CountSpecified    Name                             
-----       --------------    ----                             
10                    True    Hello World 

問題 3

プリミティブ型を戻り型として設定すると、まったく直感的でない動作になります。整数を返す単純なメソッドは System.Void メソッドとして出力され、その結果は ref パラメーターを介して利用できます。

[OperationContract]
int DoWorkE(int a, int b, int c, int d);

PS D:\Work\Sandbox\Powershell> $proxy.DoWorkE(1,$true, 2,$true,3,$true,4,$true, [ref] $intresult, [ref] $intresultPresent)
$intresult
10

PS D:\Work\Sandbox\Powershell> ($proxy | Get-Member -Name DoWorkE).Definition
System.Void DoWorkE(int a, bool aSpecified, int b, bool bSpecified, int c, bool cSpecified, int d, bool dSpecified, System.Int32& DoWorkEResult, System.Boolean& DoWorkEResultSpecified)

これは設計によるものですか。これらの追加のパラメーターが必要な理由について混乱してspecifiedいます。そうでない場合は、それらを削除できますか? int-results-by-ref は奇妙です

誰かがこのデザイン/動作に光を当てることができればありがとう.

4

1 に答える 1

5

私がずっと前に尋ねたこの質問を読んでください:

new-webproxyservice を使用して powershell から wcf のメソッドを呼び出す奇妙な動作

[XmlSerializerFormat]追加の bool パラメーターを避けるために、操作コントラクトに追加する必要があります。

于 2012-03-27T11:32:08.753 に答える