web-dev-qa-db-fra.com

WCF Comment activer les métadonnées?

J'essaye de faire fonctionner mon fichier svc sous IIS. Dans mon projet, lorsque j'appuie sur F5, le système fonctionne. Donc, je sais que tout va bien, non? Sauf pour IIS.

Je travaille sur une machine Windows XP Pro et dans IIS, j'ai ajouté un répertoire virtuel.

Voici mon code: IcarePlanActions (projet: A)

namespace WcfServiceLibrary
{
    [ServiceContract]
    public interface ICarePlanActions
    {
        [OperationContract]
        List<string> GetAllClients();
    }
}

Client: (projet: A)

namespace WcfServiceLibrary
{
    public class Client : ICarePlanActions
    {
        public List<string> GetAllClients()
        {
            List<string> clients = new List<string>();
            clients.Add("Hendrik de Jong");
            clients.Add("Miep de Berg");
            clients.Add("Jaap Jongeneel");
            clients.Add("Joop Prakman");
            clients.Add("Pieter Schaakman");

            return clients;

        }
    }
}

Web.config (projet: B)

  <configuration>
    <system.serviceModel>
      <services>
        <service behaviorConfiguration="CarePlanService.Service1Behavior"
          name="WcfServiceLibrary.Client">
          <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.ICarePlanActions">
            <identity>
              <dns value="localhost" />
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="CarePlanService.Service1Behavior">
            <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
            <serviceMetadata httpGetEnabled="true"/>
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
  </configuration>

CarePlan.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Client" %>

Lorsque j'exécute ce service (sur IIS) avec wfctestclient, le message d'erreur suivant s'affiche:

Erreur: Impossible d'obtenir les métadonnées à partir de http: //localhost/CarePlanService/CarePlan.svc S'il s'agit d'un service Windows (R) Communication Foundation auquel vous avez accès, vérifiez que vous avez activé la publication des métadonnées à l'adresse spécifiée. .

Qu'est-ce que je fais mal?

SOLUTION

Je n'ai pas obtenu le service fonctionnant sous IIS. J'ai d'abord créé manuellement un répertoire virtuel et pointé vers le directiry où se trouve le svc. Cela n'a pas fonctionné. Je ne sais pas pourquoi.

Ensuite, je suis allé dans Visual Studio et j'ai modifié les paramètres du serveur (bouton droit de la souris sur le projet, propriétés, onglet Web, cliquez sur Use local IIS Web Server, puis sur Create Virtual Directory. Lorsque j’ai fait cela, cela fonctionnait sous IIS avec le code ci-dessus.

12
Martijn

SOLUTION

Je n'ai pas obtenu le service fonctionnant sous IIS. J'ai d'abord créé manuellement un répertoire virtuel et pointé vers le directiry où se trouve le svc. Cela n'a pas fonctionné. Je ne sais pas pourquoi.

Ensuite, je suis allé dans Visual Studio et j'ai modifié les paramètres du serveur (clic droit sur le projet, propriétés, onglet Web, cliquez sur Utiliser serveur local IIS, puis cliquez sur Créer un répertoire virtuel. Lorsque j’ai procédé ainsi, cela fonctionnait sous IIS avec le code ci-dessus.

5
Martijn

Tout d’abord, supprimez l’attribut [DataContract] dans le client.

Recompilez ensuite et assurez-vous que vous avez WcfServiceLibrary.dll dans le répertoire/bin de votre répertoire virtuel.

Votre configuration devrait utiliser ce noeud final pour metadataexchange:

<endpoint address="mex" 
    binding="mexHttpBinding" 
    contract="IMetadataExchange"/>
7
Fernando Cardenas

Vous faites référence au contrat de données en tant que mise en œuvre du service. C'est invalide.

[DataContract]
public class Client : ICarePlanActions
{

<service behaviorConfiguration="CarePlanService.Service1Behavior"
      name="WcfServiceLibrary.Client">

Changez cela pour référencer l'implémentation de votre service! À quoi ressemble la mise en œuvre de votre service?

Peut-être devriez-vous simplement supprimer l'attribut DataContract de la classe Client. De plus, ce n'est pas votre "client", c'est la mise en œuvre du service.

2
Alex
  1. Exécuter "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

  2. Supprimez le répertoire virtuel et créez-le à nouveau.

0
Rooz

Il suffit de vérifier le nom du service dans le fichier Service.svc

<ServiceHost Language="C#" Debug="true" Service="SvcCalculator.**Calculator**"
           CodeBehind="**Calculator.svc.cs**" %>

J'espère que ça va marcher.

0
user3653166

Assurez-vous que vos service namespace et service class names correspondent au fichier App.config .

 <system.serviceModel>
  <services>
   <service name="WcfCustomLibrary.Service1">
    <Host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary/Service1/" />
      </baseAddresses>
    </Host>
   </service>
  </services>
 </system.serviceModel>


namespace WcfCustomLibrary
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
public class Service1 : IService1
{
0