为什么powershell会向Web服务方法签名添加其他参数

Eoi*_*ell 6 powershell wcf web-services powershell-2.0 new-webserviceproxy

我正在尝试使用Powershell从命令行ping几个WCF Web服务.例如

我有一个WCF操作

[OperationContract]
string DoWork(string name);
Run Code Online (Sandbox Code Playgroud)

我可以使用Powershell来调用它.

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

只要输入参数和返回类型是字符串,这样就可以正常工作.但是,如果我引入整数,生成的方法签名和返回类型会生成额外的paramSpecified属性.

请考虑以下具有数据协定返回类型的方法.

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

... 

[OperationContract]
SimpleClass DoWorkD(string name, int howMany);
Run Code Online (Sandbox Code Playgroud)

问题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)
Run Code Online (Sandbox Code Playgroud)

问题2

DataContract类的返回代理还具有XXXSpecified非字符串属性的附加属性.

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

Count       CountSpecified    Name                             
-----       --------------    ----                             
10                    True    Hello World 
Run Code Online (Sandbox Code Playgroud)

问题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)
Run Code Online (Sandbox Code Playgroud)

这是设计的吗?我很困惑为什么specified需要这些额外的参数,如果没有,它们是否可以被删除,并且结果的结果只是奇怪的

谢谢,如果有人能够阐明这种设计/行为.

CB.*_*CB. 5

阅读这个问题很久以前我问过:

奇怪的行为使用new-webproxyservice从powershell调用wcf的方法

您需要添加[XmlSerializerFormat]操作合同以避免其他bool参数.