Почему PowerShell добавляет дополнительные параметры в сигнатуры методов веб-служб

Я пытаюсь использовать 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)

Это по замыслу. Я не понимаю, почему эти дополнительные specified параметры нужны, и если нет, могут ли они быть удалены, а int-results-by-ref просто причудлив

Спасибо, если кто-нибудь может пролить свет на этот дизайн / поведение.

1 ответ

Решение

Прочитайте этот вопрос, который я задал давным-давно:

Странное поведение, вызывающее метод wcf из powershell с использованием new-webproxyservice

Вам нужно добавить [XmlSerializerFormat] к договору на эксплуатацию, чтобы избежать дополнительных параметров bool.

Другие вопросы по тегам