2009-11-01 7 views
11

J'ai créé un serice WCF fonctionnant correctement lorsqu'il était hébergé sur IIS.Exception d'opération non valide

maintenant, je pris le même service, et a créé une application hôte dans WPF, et en essayant de démarrer le service de cette application, je reçois cette exception:

The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the 
HttpGetUrl property is a relative address, but there is no http base address. 
Either  supply an http base address or set HttpGetUrl to an absolute address. 
+0

quel est votre code pour créer le proxy? – Dani

+0

productsServiceHost = nouveau ServiceHost (typeof (Products.ProductsService)); productsServiceHost.Open(); stop.IsEnabled = true; start.IsEnabled = false; status.Text = "Service en cours ..."; – Attilah

Répondre

22

L'erreur est tout à fait clair - vous Utilisez HTTP, vous avez activé HttpGetEnabled sur votre comportement ServiceMetadata, mais vous n'avez pas fourni d'adresse de base dans votre configuration.

Dans IIS, les adresses de base ne sont ni nécessaires ni utilisées, car l'emplacement du fichier * .svc définit votre adresse de service. Lorsque vous vous hébergez, vous pouvez et devez utiliser des adresses de base.

Changer votre config pour ressembler à ceci:

<system.serviceModel> 
    <services> 
    <service name="YourService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8080/YourService" /> 
     </baseAddresses> 
     </host> 
     <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
     ..... (your own other endpoints) ........... 
    </service> 
    </services> 
</system.serviceModel> 

Maintenant, le « HttpGetEnabled » a une adresse de base http://localhost.8080/YourService aller pour obtenir les métadonnées.

Ou si vous ne l'aimez pas, encore une fois, le message d'erreur est tout à fait clair sur votre solution: définir une URL absolue pour le HttpGetUrl dans votre ServiceMetadata:

<serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata 
      httpGetEnabled="true" 
      httpGetUrl="http://localhost:8282/YourService/mex" /> 
    </behavior> 
    </serviceBehaviors> 

Les clients peuvent obtenir vos métadonnées à partir vos points d'extrémité "mex", soit à une URL fixe définie comme dans ce deuxième exemple, soit ils iront à l'adresse de base du service pour les métadonnées (s'il y en a une). Si vous venez d'IIS et que vous n'avez rien adapté, vous n'aurez pas d'adresse de base, ni d'URL explicite et absolue pour votre point de terminaison d'échange de métadonnées, c'est pourquoi vous obtenez l'erreur que vous voyez .

Marc

+1

Je me suis retrouvé ici avec le même problème, mais pas parce que je ne savais pas quoi faire. Au contraire, je ne savais pas quoi chercher pour ajouter une "adresse de base" à ma config. Quelle ressource avez-vous utilisée pour déterminer l'existence et la syntaxe des propriétés '' et ''? – Matt

0

je faisais face à cette erreur quand j'ai essayé d'utiliser net.pipe binding.In mon cas, le comportement de service par défaut publié les métadonnées de service, c'est la cause de mon erreur. Ma solution est d'utiliser un comportement différent pour vos services. , Puis j'ai changé mon fichier de configuration selon @marc_s réponse et faire des comportements différents de service comme suit:

<serviceBehaviors> 
     <!--Default behavior for all services (in my case net pipe binding)--> 
     <behavior > 

      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <!--for my http services --> 
     <behavior name="MyOtherServiceBehavior"> 

      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
0

Vérifiez que la classe de service est correct.

Il est résolu mon problème

// Create a ServiceHost for the CalculatorService type and 
// provide the base address. 
serviceHost = new ServiceHost(typeof(ServiceClass));