2009-08-14 7 views
8

J'ai écrit un simple service Web WCF qui est configuré par programme. Il expose trois points d'extrémité qui lient différentes liaisons au même marché:Conversion de la configuration par programme du service WCF en fichier de configuration

  • WebHttpBinding
  • WebHttpRelayBinding (sur azur Microsoft)
  • Mybinding (self-made obligatoire dans une DLL supplémentaire)

Le code de configuration est assez simple pour le moment:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/")); 

host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), ""); 

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL"); 
TransportClientEndpointBehavior sbBehavior = 
    new TransportClientEndpointBehavior(); 
sbBehavior.CredentialType = TransportClientCredentialType.UserNamePassword; 
sbBehavior.Credentials.UserName.UserName = "azureUserName"; 
sbBehavior.Credentials.UserName.Password = "azurePassword"; 
sbEndpoint.Behaviors.Add(sbBehavior); 

host.AddServiceEndpoint(typeof(MyService), new MyBinding(), "http://someURL"); 

host.Open(); 

Maintenant Je veux exporter cette configuration dans un fichier de configuration car je veux pouvoir la changer sans devoir la recompiler.

Mes questions à ce moment sont:

  • Où puis-je trouver des informations précieuses pour atteindre mon objectif? La plupart des sites parlent simplement des liaisons SOAP - pas de mot sur la façon d'inclure une liaison non standard.
  • Dois-je modifier MyBinding pour accepter la configuration via app.config ou est-ce que ServiceModel l'appelle exactement comme le fait mon approche programmatique quand la configuration est bonne?

Répondre

11

OK, donc les choses les plus importantes sont les suivantes:

  • Adresse
  • liant
  • contrat

puis quelques trucs supplémentaires jetés dans

1). Adresse:

Télécharger ce d'ici:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/")); 
host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), ""); 

et ici:

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL"); 

vous aurez donc besoin de quelque chose comme:

<endpoint address="" 
<endpoint address="http://azureURL" 
<endpoint address=""http://someURL" 

dans votre service.

2) Reliure:

Le premier critère d'évaluation est un webHttpBinding, le second utilise une liaison de commande ("Mybinding") - si vous avez:

<endpoint address="" 
      binding="webHttpBinding" 
<endpoint address="http://azureURL" 
      binding="webRelayHttpBinding" 
<endpoint address=""http://someURL" 
      binding="myBinding" 

et vous devrez définir votre fixation sur mesure:

<bindings> 
    <customBinding> 
    <binding name="MyBinding"> 
     .. define the parameters of your binding here 
    </binding> 
    </customBinding> 
</bindings> 

ou créer une section <extensions> pour votre liaison stockée dans le code dans un ensemble séparé.

3) Contrats

Je ne vois pas clairement un contrat partout - vous ne jamais utiliser le typeof (MyService), mais le plus souvent, c'est le service concret exemple, pas le contrat de service qui devrait être une interface (quelque chose comme IMyService). Pourquoi n'avez-vous pas de contrat de service explicite? (Non les meilleures pratiques mais possible)

Quoi qu'il en soit, si votre mise en œuvre de services est le contrat, aussi, en même temps, alors vous avez vos deux points d'extrémité comme ceci:

<endpoint address="" 
      binding="webHttpBinding" 
      contract="MyService" /> 
<endpoint address="http://azureURL" 
      binding="webHttpRelayBinding" 
      contract="MyService" /> 
<endpoint address="http://someURL" 
      binding="myBinding" 
      contract="MyService" /> 

Vous devez ensuite ajouter quelques saupoudre ici et là (définissent la « adresse de base » du service, donner le service un nom et ainsi de suite), et devrait se retrouver avec quelque chose comme:

<system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="MyBinding"> 
      .. define the parameters of your binding here 
     </binding> 
     </customBinding> 
    </bindings> 
    <services> 
     <service name="YourNameSpace.MyService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:80/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address="" 
        binding="webHttpBinding" 
        contract="MyService" /> 
     <endpoint address="http://azureURL" 
        binding="webHttpRelayBinding" 
        contract="MyService" /> 
     <endpoint address="http://someURL" 
        binding="myBinding" 
        contract="MyService" /> 
     </service> 
    </services> 
</system.serviceModel> 

maintenant, tout ce que vous êtes absent est le comportement défini - Je vais laisser cela comme un exercice pour l'affiche :-)

Cela aide-t-il quelque chose? Comme pour les références - hmmm ..... difficile à dire .... Je suppose que les livres habituels ("Learning WCF" par MLBustamante pour débutant/intermédiaire, "Programmation WCF" par Juval Lowy pour intermédiaire/avancé) sont mon meilleur pari, et beaucoup d'expérience, vraiment. Je ne connais aucune source qui montre explicitement et enseigne comment convertir entre les paramètres dans le code et la configuration - les deux livres mentionnés montrent généralement les deux façons, et à partir de cela, vous pouvez le découvrir vous-même.

Marc

+0

Merci d'avoir expliqué le processus de construction du fichier de configuration. Comme vous vous y attendiez, la mise en œuvre du service est également le contrat. J'ai choisi cela car le contrat ne comporte que deux fonctions très générales et n'est pas réutilisable. J'ai essayé d'abord avec le webHttpBinding et j'ai commenté la configuration programmatique existante. Cependant, cela ne fonctionne pas. Le service n'est pas accessible lorsque j'ouvre http: // localhost dans mon navigateur Web. Dois-je définir d'autres paramètres pour l'application dans VS? (C'est une "application console" standard pour le moment.) – Etan

+0

Eh bien, un problème que vous avez est: pour la liaison webHttp, vous avez besoin de WebServiceHost - pour les autres liaisons, vous avez besoin du ServiceHost droit - donc vous ne serez probablement pas capable d'héberger tous les points de terminaison dans un seul (Web) ServiceHost –

1

Le prolem avec le fichier de configuration ne pas être reconnu correctement pourraient être résolus.

juste eu à ajouter

ServiceHost h = new ServiceHost(typeof(MyService)); 
h.Open(); 

à mon code, j'ai pensé que le ServiceModel démarre automatiquement le service car il connaît toutes les informations. Il est étrange que vous ajoutiez des informations sur "MyService" dans le fichier de configuration et que vous deviez ensuite le spécifier dans le code.

Cependant, la vraie réponse à mon problème a été donnée par marc_s, qui a très bien décrit l'ensemble du processus de conversion de l'approche programmatique au fichier de configuration.

Questions connexes