2012-01-05 11 views
12

Bu yüzden bu kesin sorun koştu: http://www.vistax64.com/powershell/273120-bug-when-using-namespace-parameter-new-webserviceproxy.html-Namespace kullanılırken New-WebServiceProxy cmdlet'inde hata var mı?

konunun özü Yeni-WebServiceProxy cmdlet'ini VE kullanırken -Namspace parametre sonra bir argüman ile vekil bir yöntem yürütemezsiniz olmasıdır otomatik olarak oluşturulmuş bir tip. Böyle

şey: -Namespace parametresini kaldırılması ve otomatik olarak oluşturulmuş ad her şey gayet iyi çalışıyor kullanarak, bağlantı açıklandığı gibi

// 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) 

Bu Cannot convert argument "0" of type "ns.DoSomething" to type "ns.DoSomething"

çizgisinde bir istisna atar. Ancak, ben gerçekten -Namespace kullanmak istiyorum ....

Bu senaryoda -Ad alanı kullanmak için bir "düzeltme" veya doğru yolu ile ilgili bir şey bulamıyorum. Benim için biraz ışık tutabilir mi?

cevap

3

Kodunuzu bazı düzenleyicide mi çalıştırıyorsunuz? PowerGUI düzenleyicisinden komut dosyası çalıştırırken benzer bir sorun yaşadım, ancak konsoldan çalıştırdığımda benim için iyi çalışıyor. Tüm powershell ile ilgili şeyleri kapatmayı ve tekrar açmayı deneyin.

+0

Bu çok ilginçtir. PowerGUI'den koşuyordum. – devlife

8

Aslında bir çentik daha ince bir şey görüyorsunuz. -Namespace ile, ad iki kez

yıldır açık bir komuta bir fonksiyonu süreci bloğunda, şöyle bir çok yeni-WebServiceProxy oluştururken şüpheli veya içinde yer türünde bir argüman yürütemediğinden tekrar tekrar denir. Her arama yaptığınızda, yeniden oluşturmaya çalışır ve -Ad alanı ile, bu, AppDomain'de ilişkili türlerle küçük çarpışmalar bırakır. Sonunda birkaç tanesi var ve bu hatayı aldınız.

  • emin aktardıktan kez ve yalnızca bir kez AppDomain başına olun:

    bu yaklaşık iki yolu vardır. PowerGUI ya da ISE gibi bir şeyde, bu sesler duyulmasından daha zor olabilir, çünkü sadece düşündüğünüz runspaces (açık sekmeler gibi) değil, aynı zamanda sizin kullanamadığınız runspaces (eklentiler tarafından ateşlenenler gibi) veya süreç içi işler)

  • Uzak "daha kolay", ancak önemli ölçüde daha şifreli bir geçici çözüm, belirli bir ad alanına göre basit oluşturma türleri oluşturmaktır.

Bunu anlatmaktan çok daha kolay gösteriliyor.

ben Office365/Exchange Web Hizmetleri için sahip bir modül ile bu sorunu vardı ve örtülerin altında, bu gibi bir şey vardır:

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

Bu nedenle, iyi, açıkçası biraz şifreli olmakla Exchange Web Hizmetleri. Ayrıca, karmaşık nesne modellerinden doğrudan oluşturulan birçok web hizmeti de vardır.

Ne yazık ki, bu New-WebServiceProxy ile çalışan web hizmetlerinin büyük çoğunluğu.

Modülünüzde oluşturduğunuz web hizmeti nesnesini (yukarıdaki gibi $script:variablename kullanarak) önbelleğe almak için hala iyi bir yöntemdir, ancak proxy nesnesi tarafından web hizmeti parçalarına başvurmak için bu tuhaf hile beni daha fazla kez kurtardı 'sevdim.

Yardım Bu

İlgili konular