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.
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? –
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. –
Ok, gracias Christian –