6

Estoy intentando usar Powershell para hacer ping a un par de servicios web de WCF desde la línea de comandos. p.ej.¿Por qué Powershell agrega parámetros adicionales a las Firmas de métodos de servicios web?

que someterse a una operación de WCF

[OperationContract] 
string DoWork(string name); 

Y puedo llamar a eso con el uso de Powershell.

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

Esto funciona bien siempre que los parametros de entrada y los tipos de retorno sean cadenas. Sin embargo, si introduzco enteros, las firmas de métodos generados & devuelven tipos de propiedades paramSpecified adicionales generadas.

Considere el siguiente método con un tipo de devolución de contrato de datos.

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

... 

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

Problema 1

La firma del método que está mal & tiene un parámetro adicional 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) 

Problema 2

El proxy devuelto de la clase DataContract también tiene XXXSpecified propiedades adicionales para propiedades que no son cadenas.

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

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

Problema 3

Configuración de un tipo primitivo como tipo de retorno sólo tiene un comportamiento completamente intuitivo. Un método simple que devuelve un entero sale como un método System.Void, cuyos resultados están disponibles a través de los parámetros de 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) 

Es por diseño. Estoy confundido sobre por qué estos parámetros adicionales specified son necesarios y si no, pueden ser eliminados y el int-results-by-ref es simplemente extraño

Gracias si alguien puede arrojar algo de luz sobre este diseño/comportamiento.

Respuesta

5

Leer esta pregunta que hice hace mucho tiempo:

Strange behaviour calling method of wcf from powershell using new-webproxyservice

es necesario agregar [XmlSerializerFormat] al contrato de operación para evitar parámetros adicionales bool.

+0

Gracias. ¿Esto tendrá algún efecto adverso en cualquier otra aplicación cliente .NET que ya esté llamando al servicio? Es este un atributo "Rompiendo". ¿Necesitarán ser recompilados contra el punto final? –

+0

Después de que agregué el atributo, volví a compilar y publiqué todas las aplicaciones de mis clientes wcf (todas en .NET 2.0 o 4.0) sin ningún cambio de comportamiento. Pero lo probé solo con la aplicación .net y Powershell. –

+0

Ok, gracias Christian –

Cuestiones relacionadas