2012-01-05 14 views
12

così mi sono imbattuto in questo problema esatto: http://www.vistax64.com/powershell/273120-bug-when-using-namespace-parameter-new-webserviceproxy.htmlErrore nel cmdlet New-WebServiceProxy quando si utilizza -Namespace?

Il nocciolo della questione è che quando si utilizza il cmdlet New-WebServiceProxy E il parametro -Namspace allora non è possibile eseguire un metodo sul proxy con un argomento di un tipo autogenerato.

Qualcosa di simile a questo:

// In the service 
public void DoSomething(DoSomethingRequest request) { ... } 


$proxy = New-WebServiceProxy -Uri "http://something.com/MyService.svc" 
      -Namespace ns 
$req = New-Object ns.DoSomethingRequest 
$proxy.DoSomething($req) 

Questo genera un'eccezione lungo le linee di Cannot convert argument "0" of type "ns.DoSomething" to type "ns.DoSomething"

Come è spiegato nel link, eliminando il parametro -Namespace e utilizzando il namespace generato automaticamente tutto funziona bene. Tuttavia, mi piacerebbe davvero utilizzare lo spazio dei nomi ....

Non riesco a trovare nulla relativo a una "correzione" o il modo corretto di utilizzare lo spazio dei nomi in questo scenario. Qualcuno può far luce su questo per me?

risposta

3

Stai eseguendo il tuo codice in qualche editor? Ho avuto problemi simili durante l'esecuzione di script dall'editor PowerGUI, ma sta funzionando bene per me quando lo eseguo dalla console. Prova a chiudere tutte le tue cose relative a PowerShell e aprila di nuovo

+0

Questo è interessante. Stavo correndo da PowerGUI. – devlife

8

In realtà stai vedendo qualcosa di molto più sottile. Con -Namespace, non è possibile eseguire un argomento del tipo nello spazio dei nomi due volte

Ho il sospetto che si sta creando New-WebServiceProxy molto, come, nel blocco di processo di una funzione, o all'interno di un comando che è chiamato ripetutamente. Ogni volta che lo chiami, tenta di rigenerarsi e, con -Namespace, questo lascia collisioni ridotte con tipi associati nell'AppDomain. Finiscono per essere alcuni di loro, e ottieni questo errore.

Ci sono due modi per aggirare questo:

  • assicurarsi che sia importata una sola volta per AppDomain. In qualcosa come PowerGUI o ISE questo potrebbe essere più difficile di quanto sembri, perché non solo ci sono gli spazi di lavoro a cui si pensa (come le schede aperte), ma ci sono gli spazi di lavoro che non si fanno (come quelli accesi dagli add-on, o lavori in corso)
  • La soluzione alternativa "più semplice", ma decisamente più criptica, consiste nel creare semplici tipi relativi a un determinato spazio dei nomi.

Questo è molto più facile da mostrare che raccontare.

ho avuto questo problema con un modulo che ho per/Exchange Web Services Office365, e, sotto le coperte, ha qualcosa come:

$createItemType = 
    New-Object "$script:ExchangeWebServiceNamespace.CreateItemType" 
-Property @{ 
MessageDisposition = $messageDisposition 
MessageDispositionSpecified = $true 
Items = 
    New-Object "$script:ExchangeWebServiceNamespace.NonEmptyArrayOfAllItemsType" 
} 

Questo è ovviamente un po 'criptico, ma, bene, in modo è Exchange Web Services. E così tanti servizi web sono costruiti direttamente da modelli di oggetti complessi.

Sfortunatamente, questa è la stragrande maggioranza dei servizi Web con cui funziona New-WebServiceProxy.

Tenere a mente, è comunque consigliabile memorizzare nella cache l'oggetto del servizio Web creato nel modulo (utilizzando $script:variablename come sopra), ma questo trucco strano per fare riferimento a parti del servizio Web dall'oggetto proxy mi ha salvato più volte di Mi piacerebbe.

Spero che questo aiuti

Problemi correlati