6

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.

risposta

5

letto questa domanda ho chiesto molto tempo fa:

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

è necessario aggiungere [XmlSerializerFormat] al contratto operazione per evitare i parametri bool aggiuntivi.

+0

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? –

+0

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. –

+0

Ok Grazie Christian –

Problemi correlati