Sto provando a utilizzare Powershell per eseguire il ping di un paio di servizi Web WCF dalla riga di comando. per esempio.Perché PowerShell aggiunge parametri aggiuntivi alle firme dei metodi del servizio Web
ho un intervento WCF
[OperationContract]
string DoWork(string name);
e posso chiamare che con PowerShell utilizzando.
$proxy = New-WebServiceProxy -Uri 'http://localhost/TestService/Service.svc'
$proxy.DoWork('Hello World')
Questo funziona bene fintanto che i parametri di input e i tipi di ritorno sono stringhe. Tuttavia, se introduco numeri interi, le firme del metodo generato & restituiscono tipi di proprietà paramSpecified aggiuntive generate.
Considerare il seguente metodo con un tipo di reso del contratto dati.
[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 metodo è sbagliato & ha un parametro supplementare 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
Il proxy restituito della classe DataContract dispone inoltre di ulteriori XXXSpecified
proprietà per proprietà non stringa.
______________________________________________________________________
PS D:\Work\Sandbox\Powershell> $proxy.DoWorkD("Hello World", 10, $true")
Count CountSpecified Name
----- -------------- ----
10 True Hello World
Problema 3
Impostazione di un tipo primitivo, come tipo di ritorno deve solo comportamento del tutto intuitivo. Un metodo semplice che restituisce un numero intero viene fuori come metodo System.Void, i cui risultati sono disponibili tramite parametri 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)
È questo in base alla progettazione. Sono confuso sul motivo per cui questi parametri aggiuntivi specified
sono necessari e in caso contrario, possono essere rimossi e int-results-by-ref è solo bizzarro
Grazie a tutti se qualcuno può far luce su questo disegno/comportamento.
Grazie. Ciò avrà effetti negativi su qualsiasi altra applicazione Client .NET che sta già chiamando il servizio. È un attributo "Breaking". Dovranno essere ricompilati contro il punto finale? –
Dopo aver aggiunto l'attributo, ricompilato e pubblicato il mio wcf tutte le mie applicazioni client (tutte in .net 2.0 o 4.0) non hanno cambiato comportamento. Ma l'ho provato solo con .net e PowerShell. –
Ok Grazie Christian –