2009-05-07 21 views
10

Herhangi bir bağlayıcı veya son nokta belirtmeden hizmet oluşturduğumda (WCF'yi Visual Studio aracılığıyla kaydettiğimde App.config dosyasındaki oluşturulan değerlerden okuyorsa) tamamıyla çalışan bir WCF hizmetim var. (Değerler yapılandırmasındaki okunur çünkü)WCF: Bu App.config değerlerini nasıl yeniden programlayabilirim?

return new SmsServiceReference.SmsEngineServiceClient(); 

Bu ok çalışır:

Hizmetin başvuru döndüren basit bir yöntem var. Ancak, bir veritabanı (örneğin URI) içinde bu değerlerin bazılarına sahip olmak istiyorum ve böyle bir şey yapmak istiyorum: Bu işe yaramazsa

 Binding binding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

. Hizmet referansını kullanmaya çalıştığımda bir istisna atar.

Bunun nedeni, App.config öğesinin, iki satırın sağlanmadığı (daha açık) olduğundan daha fazla bilgiye sahip olduğundan şüpheleniyorum. Soru şu, aşağıdaki App.Config değerlerini programlı olarak nasıl çoğaltabilirim?

App.Config öğemin parçası: (URI, inocent'i korumak için değiştirildi).

<endpoint address="http://www.myuri.com/Services/Services.svc/basic" 

ancak kod örneğinde

, oluşturmak:

EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

adresleri aynı olmalıdır

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.myuri.com/Services/Services.svc/basic" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService" 
     contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" /> 
</client> 

cevap

16

App config değerlerin çoğu da bağlama içinde özellikleridir ve programlama yoluyla yeniden olabilir. Şahsen, altında bir bağlayıcı

 

public static BasicHttpBinding CreateBasicHttpBinding() 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.AllowCookies = false; 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      binding.SendTimeout = new TimeSpan(0, 1, 0); 
      // add more based on config file ... 
      //buffer size 
      binding.MaxBufferSize = 65536; 
      binding.MaxBufferPoolSize = 534288; 
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

      //quotas 
      binding.ReaderQuotas.MaxDepth = 32; 
      binding.ReaderQuotas.MaxStringContentLength = 8192; 
      // add more based on config file ... 

      return binding; 
     } 
 

oluşturmak için gibi bir yöntem kullanmak Ve ben Endpoint adresi oluşturmak için böyle bir şey kullanmak

 

public static EndpointAddress CreateEndPoint() 
     { 
      return new EndpointAddress(Configuration.GetServiceUri()); 
     } 
 

serviceUri hizmet URL'si olacak gibi http://www.myuri.com/Services/Services.svc/basic

Son olarak

 

Binding httpBinding = CreateBasicHttpBinding(); 
EndpointAddress address = CreateEndPoint(); 
var serviceClient = new MyServiceClient(httpBinding, address); 
 
+0

Bu hile yaptı. Teşekkürler. –

1

Eh, config istemci bitiş noktası bu URL'yi belirtir - yapılandırmadakiler işe yararsa, kodunuzu şu şekilde değiştirmeniz gerekir:

EndpointAddress endpointAddress = new EndpointAddress("http://www.myuri.com/Services/Services.svc/basic"); 

Zihin sen - (my.uri.com vs www.myuri.com, /service.svc yerine /Services/Services.svc ait) kodunuzu örneğinde çeşitli küçük yazım hataları vardır.

Düzeltilmiş son nokta adresi ile çalışıyor mu?

Marc

+0

ben fo özür dileriz hizmet istemcisi oluşturmak için "küçük yazım hataları", sadece "basit" olmaya çalışıyordum. Koddaki son nokta adresi kullanımı (ve uygulama yapılandırmasında) aynıdır, ancak çalışmaz. Bir fark var, App.config/temel bir şey var. Bu URI'nin bir parçası değil, VSTUDIO'nun bunu neden ekledi bilmiyorum. Bu URL'ye (/ basic ile) göz atarsanız işe yaramıyor. Söylemeye gerek yok, ikisini de denedim.App.config'in sahip olduğu "son nokta" yaratımda bir şey eksik olduğumu farz ediyorum. Aslında, son noktayı herhangi bir parametre vermiyorum ama uri, diğer tüm APp.config bilgileri hakkında ne? –

+0

URL'nin tam yazımı çok önemlidir, bu nedenle burada "basit" olmak karışıklığa yol açar. Sunucu bölümünün yapılandırma dosyasını bize gösterir misiniz? –

+0

Merhaba marc, sorun URI değildi, ancak istemci web.config'imde programatik olarak oluştururken bağlayıcıya geçmediğim bazı parametreler vardı. Her şeyi tam olarak web.config'de olduğu gibi (Emmanuel'in önerisini kullanarak) geçtim ve işe yaradı. Yardım ettiğin için teşekkür ederim! Sizin için +1 –