2008-12-16 4 views
10

J'ai un contrôle silverlight qui fait référence à un service wcf activé par silverlight.url relative dans la liaison de service wcf

Lorsque j'ajoute une référence au service de mon contrôle silverlight, il ajoute ce qui suit à mon fichier ClientConfig:

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_DataAccess" maxBufferSize="2147483647" 
        maxReceivedMessageSize="2147483647"> 
        <security mode="None" /> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost:3097/MyApp/DataAccess.svc" 
       binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_DataAccess" 
       contract="svcMyService.DataAccess" name="BasicHttpBinding_DataAccess" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

Comment puis-je spécifier une URL relative dans l'adresse de point final au lieu de l'URL absolue? Je veux que cela fonctionne quel que soit l'endroit où je déploie l'application web sans avoir à modifier le fichier clientconfig, car le composant silverlight et l'application web seront toujours déployés ensemble. Je pensais pouvoir spécifier "DataAccess.svc" mais cela ne semble pas plaire.

Répondre

4

Vous ne pouvez pas utiliser les URI relatives dans la configuration du point de terminaison client. Ce que vous pouvez faire, c'est juste ajouter un autre constructeur à votre classe proxy qui prendra un certain type de paramètre d'URL que vous pouvez peut-être obtenir d'une autre valeur de configuration ou utiliser l'une des méthodes de classe Dns.

+0

Si je devais adopter cette approche, Où devrais-je mettre mon paramètre url relatif? Je regarde le ServiceReferences.ClientConfig et je ne vois pas un endroit pour le mettre - il ne semble pas avoir les mêmes éléments et un fichier web.config. – Jeremy

14

Ma solution:

Au lieu d'utiliser le constructeur Devault (qui utilise le fichier ServiceReferences.ClientConfig) pour instancier ma classe proxy, j'utilise les éléments suivants:

svcMyService.DataAccessClient svcProxy_m; 

System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding(); 

/* 
Create an end point, build a an absolute uri reference by specifing the host address and a relative referece to the service page. 
Application.Current.Host.Source will be something like Http://server/app/ClientBin/SilverlightApp.xap"<br/><br/> 
Specifying Uri(Application.Current.Host.Source, "../DataAccess.svc")); will return "Http://server/app/DataAccess.svc" 
*/ 

System.ServiceModel.EndpointAddress address = new System.ServiceModel.EndpointAddress(new Uri(Application.Current.Host.Source, "../DataAccess.svc")); 

svcProxy_m = new svcMyService.DataAccessClient(binding, address); 
+0

+1 vient de résoudre mon problème de déploiement Silverlight. – geofftnz

+0

Je pense que le comportement décrit ici aurait été le comportement silverlight par défaut. Je suis perplexe que nous aurions besoin de faire cela pour chaque projet. :( – Jeremy

1

Je l'ai utilisé uri relative configuration et mon application SL4 fonctionne.

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_ICorrectionService" maxBufferSize="2147483647" 
        maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered"> 
        <security mode="None" /> 
       </binding> 
      </basicHttpBinding> 
     </bindings>   
     <client> 
      <endpoint address="/CorrectionService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICorrectionService" 
      contract="CorrectionService.ICorrectionService" name="BasicHttpBinding_ICorrectionService" /> 
     </client>   
    </system.serviceModel> 
</configuration>