2009-05-07 8 views
10

J'ai un service WCF qui fonctionne bien si je crée le service sans spécifier de liaison ou de point de terminaison (il le lit à partir des valeurs générées dans App.config lorsque j'ai enregistré le WCF via Visual Studio).WCF: Comment est-ce que je peux recréer par programme ces valeurs App.config?

J'ai une méthode simple qui renvoie la référence de service:

return new SmsServiceReference.SmsEngineServiceClient(); 

Cela fonctionne bien (car les valeurs sont lues dans la configuration). Cependant, je voudrais avoir quelques-unes de ces valeurs dans une base de données (l'URI par exemple) et je voudrais faire quelque chose comme ceci:

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

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

Cela ne fonctionne pas. Il déclenche une exception lorsque j'essaie d'utiliser la référence de service.

Je suppose que c'est parce que mon App.config a plus d'informations que les deux lignes là-haut ne fournissent pas (évidemment). La question est, comment puis-je répliquer les valeurs App.Config suivantes par programme?

Voici le fragment de mon App.Config: (l'URI a été modifiée pour protéger l'inocent).

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

Répondre

16

La plupart des valeurs dans la configuration App sont également des propriétés dans la liaison et peuvent être recréés programatically. Personnellement, j'utilise une méthode telle que celle ci-dessous pour créer la liaison

 

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; 
     } 
 

Et j'utiliser quelque chose comme ceci pour créer mon adresse Endpoint

 

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

Le serviceURI sera l'URL de service tel que http://www.myuri.com/Services/Services.svc/basic

Enfin pour créer le client de service

 

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

Cela a fait l'affaire. Merci. –

1

Eh bien, le point de terminaison client dans la configuration spécifie l'adresse suivante:

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

mais dans votre exemple de code, vous créez:

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

Les adresses doivent correspondre - Si celui de la configuration fonctionne, vous devrez changer votre code pour:

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

Rappelez-vous - il y a plusieurs petites fautes de frappe dans votre exemple de code (my.uri.com vs www.myuri.com, /service.svc au lieu de /Services/Services.svc).

Fonctionne-t-il avec l'adresse de point final corrigée?

Marc

+0

Je fo présenter des excuses r les "petites fautes", j'essayais juste d'être "simple". L'adresse d'extrémité utilisée dans le code (et dans la configuration de l'application) est la même, mais cela ne fonctionne pas. Il y a une différence, le App.config a la chose/basic. Cela ne fait pas partie de l'URI, ne sais pas pourquoi VSTUDIO a ajouté cela. Si vous naviguez vers cette URL (avec/basic) cela ne fonctionne pas. Inutile de dire que j'ai essayé les deux.Je suppose qu'il me manque quelque chose dans ma création "endpoint" que l'App.config a. En fait, je ne donne à mon point de terminaison aucun paramètre mais l'uri, qu'en est-il de toutes les autres infos APp.config? –

+0

L'orthographe exacte de l'URL est cruciale, donc être "simple" ici mène à la confusion. Pouvez-vous nous montrer le fichier de configuration pour la partie serveur? –

+0

Salut Marc, le problème n'était pas l'URI, mais certains paramètres que j'avais dans mon client web.config que je ne passais pas à la liaison lors de la création par programme. J'ai tout passé exactement comme dans le web.config (en utilisant la suggestion d'Emmanuel) et ça a marché. Merci de votre aide! +1 pour vous –

Questions connexes