我正在尝试使用Powershell从命令行ping几个WCF Web服务。 e.g。
我有一个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只是奇怪的
感谢任何人都能对这种设计/行为有所了解。
答案 0 :(得分:5)
阅读这个问题很久以前我问过:
Strange behaviour calling method of wcf from powershell using new-webproxyservice
您需要在操作合同中添加[XmlSerializerFormat]
以避免其他bool参数。