2013-03-14 12 views
8

Ben kendi mecliste bir elle yazılmış WCF vekil var, çok basit:Bir yapılandırma dosyasıyla birlikte bir Powershell komut dosyasında özel bir WCF proxy'si nasıl kullanılır?

public class MyServiceClient : ClientBase<IMyService>, IMyService 
{ 
    public MyServiceClient() 
    { 
    } 

    public MyServiceClient(string endpointConfigurationName) : 
     base(endpointConfigurationName) 
    { 
    } 
} 

Ben bir PowerShell komut dosyası içine bu yükleme ediyorum: Sonra App ayarlamak çalışıyorum

Add-Type -Path "$LocalPath\MyService.Client.dll" 
Add-Type -Path "$LocalPath\MyService.Contracts.dll" 

.Config müşteri yerine komut kendisi daha yapılandırma tanımlanmış bir bitiş örneklenebilmektedir böylece (böylece other posts uyarınca):

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "$LocalPath\MyService.Client.dll.config") 

I AppDomain'i kontrol ettiniz ve config dosyası ConfigurationFile özelliği olarak ayarlandı.

Bir müvekkilin bir örneğini oluşturun:

Exception calling ".ctor" with "1" argument(s): "Could not find endpoint element with name 'MyServiceHttpEndpoint' and contract 'MyService.Contracts.IMyService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this name could be found in the client element."

Herhangi bir fikir:

$endpointName = "MyServiceHttpEndpoint" # defined in the app.config file 
$myclient = New-Object MyService.Client.MyServiceClient($endpointName) 

Bu şunu demek yere düşer? Komut dosyasında son noktayı el ile oluşturmak istemiyorum - yapılandırmadan okunması gerekiyor.

+1

Hata diyor: yapılandırma dosyasına baktı ve "MyServiceHttpEndpoint" adlı bir son nokta bulamadı. Anlamlı yardım istiyorsanız, gerçek konfigürasyon dosyasını göndermeniz gerekecek. – ErnieL

+0

Ayrıca 'Uygulamanız için bir yapılandırma dosyası bulunamadı' - bu da sorun diyor. Yapılandırma dosyası gayet iyi, Powershell'in dışında sorunsuz çalışıyor. – MalcomTucker

+0

AppDomain'i kontrol ettim ve config dosyası var ve AppDomain'de doğru.ConfigurationFile' özelliği, bu yüzden, sadece config dosyasını tüketen istemci proxy'sine bağlayamıyorum. Yapılandırma eklendi ... – MalcomTucker

cevap

0

Montajlarınız 32 bit veya 64 bit hedef olarak oluşturulmuş mu?

Birden çok durumda 32/64 sorunla karşılaştım.

Sadece 64 bit işletim sisteminde çalışıyorsanız, iki PowerShells 64 bit (normal) ve 32 bit (32 harici derleme gerektiğinde araya girme) elde ettiğinizden emin olun.

0

Tam yapılandırmanızı gönderdiyseniz daha kolay olurdu, ancak aşağıdaki bölümü kaçırıyormuşsunuz gibi geliyor.

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="ServiceAddress" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" 
     contract="MyService.Contracts.IMyService" name="MyServiceHttpEndpoint" /> 
    </client> 
</system.serviceModel> 

Durum böyle olmadığından emin olabilirsiniz.

Yani denemek ve Powershell Uygulama doğru yapılandırma toplayıp olduğundan emin olalım

...

beklenen senin Powershell dosyasına böyle bir şey eklemek olarak Powershell uygulaması yapılandırma toplayıp ise emin olmak için:

Get-Content $LocalPath\MyService.Client.dll.config | foreach {Write-Output $_} 

Eğer bir yapılandırma sorunu değilse, bunun üzerinde hemfikir olduğumuzu düşünüyorum.

Yapılandırmadaki ayarları görebilir miyim? Artık, powershell'in yapılandırmayı görebileceğini ve dll'inizi arayabileceğini biliyoruz.

Yapılandırma dll ile aynı konumda mı?

Eklenti, beklemediğimiz bir şey yapar mı? o eklenti tip

benziyor msdn docs baktığımızda bir Windows PowerShell oturuma bir Microsoft .NET Framework türü (sınıf) ekler.

sınıf o zamanki gibi yapılandırma erişimi olmayan bir powershell oturumda şimdi ise? Bilmiyorum.

Bunun bir fark yaratıp yaratmadığını görmek için [Reflection.Assembly]::LoadFrom ve add-type'u deneyebilirsiniz.

Kesin bir cevabım yok korkuyorum ama umarım sürtüklerim biraz yardımcı olur. Eğer gibi kod bakmak olun powershell

olduğunda

0

ciltleme türünü eksik gibi, basicHttpBinding gerektiğini görünüyor:

$endpointName = "MyServiceHttpEndpoint" 
$httpBinding = new-object System.ServiceModel.WSHttpBinding 
$myclient = New-Object MyService.Client.MyServiceClient($httpBinding, $endpointName) 
0

şekilde bunda bir fark var gibi görünüyor Powershell ve Powershell ISE bunu halleder.

ISE ile (en azından kullandığım sürüm), yeniden yüklemeye zorlamak için yapılandırmayı temizlemeniz gerekir. Yine de, .dll.config dosyanızın içeriğini powershell ISE yapılandırmasına da koyabilirsiniz. Ancak, bu kötü görünüyor. Aşağıda yayınlanan kod çalışır. Bunun bir kısmını bu konuya yönlendirdim.

# $dllPath is the path to the dll we want to load 
# first point to the correct config file 
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "$dllPath.config") 

# PowerShell ISE is a PITA we have to override the config 
if ($psISE -ne $null) { 
    Add-Type -AssemblyName System.Configuration 
    [Configuration.ConfigurationManager].GetField("s_initState", "NonPublic, Static").SetValue($null,0) 
    [Configuration.ConfigurationManager].GetField("s_configSystem", "NonPublic, Static").SetValue($null,$null) 
    ([Configuration.ConfigurationManager].Assembly.GetTypes() | where {$_.FullName -eq "System.Configuration.ClientConfigPaths"})[0].GetField("s_current", "NonPublic, Static").SetValue($null, $null) 
} 

#Now load the DLL 
$null = [Reflection.Assembly]::LoadFrom($dllPath) 

# DLL and Config should be loaded - test 
0

ben hep birlikte mümkünse yapılandırma dosyası atlama öneririm. API'nız bir MEX veya WSDL uç noktası sağlıyorsa, bunları sorgulayarak proxy'lerinizi oluşturmayı deneyin ve bellekte ciltleme yapılandırmasını oluşturmak için WsdlImporter kullanın. Bu noktadan, eğer gerekiyorsa onu bellekte değiştirebilirsiniz.

kullanarak bir güvenlik belirteci hizmeti ile tümleşik olduğundan, WCF hizmeti yapılandırma açısından çok ağır çalıştığı üzerinde çalıştığım proje için yaptığım budur.

Benzer bir question için galeride mevcut WcfPS modülünü kullanmayı denedim. Çünkü diğer soruyla bir çakışma var, bunun bir kısmını alıntılayacağım. modül için code

açık kaynak ve her ne kadar onun Senaryoda System.ServiceModel ve System.IdentityModel montajın .net framework sınıfları ve meclisleri büyük ölçüde bağlıdır. Ben bu derlemeler içinde apis çoğu .NET standart 2'de mevcut değildir, bu yüzden modül maalesef non-windows işletim sistemleri çalışmayacak çünkü bu söz. Bu konuyla ilgili daha fazla bilgiyi WCFPS - PowerShell module to work with SOAP endpoints numaralı yazımda okuyabilirsiniz.

Bu

Eğer Visual Studio ve hiçbir yapılandırmasına kullanmak satır içi .net türlerinin herhangi ithalat, ne vekiller gerekmez Bu yöntemle README

#region Initialize the channel/client 
$svcEndpoint="http://myserviceprovider/Service1.svc" 

$wsImporter=New-WcfWsdlImporter -Endpoint $svcEndpoint -HttpGet 
$proxyType=$wsImporter | New-WcfProxyType 

# select the endpoint and implicitly the binding from the imported configuration 
$endpoint=$wsImporter | New-WcfServiceEndpoint -Endpoint $svcEndpoint 
$channel=New-WcfChannel -Endpoint $endpoint -ProxyType $proxyType 
#endregion 

#region Use the channel/client 
$channel.Method1() 
$channel.Method2() 
#endregion 

gelen örneğidir. Muhtemelen kullanım durumunuza göre ayarlamanız gerekecek. Modülün işlevselliğini iyileştirirseniz, lütfen bir çekme isteği gönderin.

İlgili konular