web-dev-qa-db-fra.com

L'hôte de service WCF ne peut trouver aucune métadonnée de service

Je suis en train d'apprendre wcf et je suis actuellement si loin.

Fichier CS:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace wcfLib
{            
    [ServiceContract]
    public interface IfaceService
    {
        [OperationContract]
        int wordLen(string Word);
    }

    public class StockService : IfaceService
    {
        public int wordLen(string Word)
        {
            return Word.Length;
        }
    }
}

Pourtant, lorsque j'essaie de l'exécuter, une erreur se produit:

L'hôte de service WCF ne peut trouver aucune métadonnée de service ...

Avez-vous des idées de ce que ça pourrait être?

Fichier de configuration:

<system.serviceModel>
   <services>
      <service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="wcfLib.ser">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/wcfLib/Service1/" />
          </baseAddresses>
        </Host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="wcfLib.Service1Behavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
17
Rob

Vous devez avoir les éléments suivants dans votre fichier de configuration:

1) a comportement du service pour les métadonnées:

<behaviors>
  <serviceBehaviors>
     <behavior name="Metadata"> 
        <serviceMetadata httpGetEnabled="true" />
     </behavior>
  </serviceBehaviors>
</behaviors>

2) référencer ce comportement de service dans la configuration de votre service

<service name="wcfLib.StockService" 
         behaviorConfiguration="Metadata">
     ....
</service>

* La valeur du nom dans les balises de service du fichier de configuration doit avoir le même nom que la classe physique qui implémente le contrat. N'oubliez pas que si le nom de la classe change, veillez à modifier cette valeur pour qu'elle corresponde.

3) un point final pour MEX (échange de métadonnées)

<service name="wcfLib.StockService" 
         behaviorConfiguration="Metadata">
     ....

    <endpoint name="mex"
              address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
</service>

Avec tout cela en place, tout devrait bien se passer! :-)

25
marc_s

J'ai eu exactement le même problème et je parcourais ma configuration avec vigueur et tout était aligné avec les points de terminaison des métadonnées, etc. Cette ligne:

<service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1">

La name valeur DOIT, DOIT avoir le nom de la classe physique qui exécute le contrat. J'ai oublié ... encore une fois et je l'ai nommé arbitrairement en pensant que ce pourrait être n'importe quelle chaîne. Ainsi, dans le cas ci-dessus, la classe d'implémentation doit être nommée Service1. Si le nom de la classe change, veillez à modifier cette valeur.

Cela ressemble à du contenu de WCF 101 et je suis toujours brûlé même si je fais du WCF depuis CTP dans Framework 3.0. Blabla...

15
atconway

Le moyen le plus simple de créer ce problème consiste simplement à reformuler le nom de votre interface. Cela change certainement le nom de l'instance dans votre projet mais la mise à jour du fichier web.config échoue. Pour recréer créer un nouveau service, renommer votre interface et frapper F5, boom, le dialogue de métadonnées apparaît :-) La réponse est comme ci-dessus, n'oubliez pas de modifier manuellement votre fichier web.config.

Cordialement

1
Alan Simes

L'activation HTTP était activée. Assurez-vous de l'avoir.

Ensure HTTP Activation is on

1
Jason Jeyanandan

Je sais que c'est une vieille question, mais je pensais donner mes 2 centimes sur le sujet, car cela m'est juste arrivé.

J'ai en quelque sorte changé ma plate-forme de construction de "Tout processeur" en "x86" pour le service Web lui-même. La seconde fois que je l'ai remplacé par "Tout processeur", le problème a été résolu.

0
Thierry
// get the <system.serviceModel> / <services> config section
ServicesSection services = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection;

ServiceHost Host = new ServiceHost(typeof(SelfHostedService.Service));

// enumerate over each <service> node
foreach (ServiceElement aService in services.Services)
{
    Console.WriteLine();
    Console.WriteLine("Name: {0} / Behavior: {1}", aService.Name, aService.BehaviorConfiguration);

    // enumerate over all endpoints for that service
    foreach (ServiceEndpointElement see in aService.Endpoints)
    {
        Console.WriteLine("\tEndpoint: Address = {0} / Binding = {1} / Contract = {2}", see.Address, see.Binding, see.Contract);
        //Host.AddServiceEndpoint(
    }
}

try
{
    Console.WriteLine("Service EndPoints are: ");
    foreach (ServiceEndpoint endpoint in Host.Description.Endpoints)
    {
        Console.WriteLine("{0} ({1})", endpoint.Address.ToString(), endpoint.Binding.Name);
    }
    Host.Open();

    Console.WriteLine(string.Concat("Service is Host at ", DateTime.Now.ToString()));
    Console.WriteLine("\n Self Host is running... Press <Enter> key to stop");
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message.ToString());
}

Si cela ne fonctionne toujours pas, supprimez le fichier de configuration actuel et recréez-le avec le nom par défaut App.config, cela fonctionne.

0
Muhammad Mubashir

Il semble que vous deviez ajouter un noeud final d'échange de métadonnées:

http://en.csharp-online.net/WCF_Essentials%E2%80%94Metadata_Exchange

0
RQDQ

Par défaut, Visual Studio va essayer de configurer une interface utilisateur/test pour vous permettre de jouer avec votre nouveau service. Pour ce faire, il faut connaître la structure et les méthodes proposées par votre service. Ceci est réalisé en utilisant une définition au format WSDL standard. Cependant, WCF ne publiera pas ces données par défaut.

Vous devez configurer un comportement de point de terminaison metadataexchange sur acehive.

Soit poster votre fichier de configuration ici et nous pouvons vous aider, ou google/stack search pour metadataexchange et wsdl dans WCF

0
Taylor Bird

Vous pouvez également obtenir cette même erreur si vous créez votre hôte de service par programme et oubliez d'ajouter les attributs [ServiceContract] et [OperationContract] au contrat d'interface.

0
StingyJack

J'ai eu cette erreur parce que mon nom de service était faux. Utiliser netTcpBinding et mexTcpBinding avec httpGetEnabled = False a fonctionné.

0
PeterX