Я пытаюсь использовать Powershell, чтобы пропинговать пару веб-сервисов WCF из командной строки. например
У меня есть операция 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)
Так задумано.Я не понимаю, зачем нужны эти дополнительные указанные
параметры, а если нет, то можно ли их удалить, а int-results-by-ref просто странный
Спасибо, если кто-нибудь может пролить свет на этот дизайн/поведение.