Condividi tramite


Procedura: pubblicare metadati per un servizio utilizzando un file di configurazione

Questo è uno di due argomenti in cui viene illustrato come pubblicare metadati per un servizio Windows Communication Foundation (WCF). Esistono due modi per specificare la pubblicazione di metadati da parte di un servizio, ovvero utilizzando un file di configurazione oppure utilizzando il codice. In questo argomento viene illustrato come pubblicare metadati per un servizio utilizzando un file di configurazione.

ms734765.Caution(it-it,VS.100).gifAttenzione:
In questo argomento viene illustrato come pubblicare metadati in modo non sicuro. Qualsiasi client può recuperare i metadati dal servizio. Se è necessario che il servizio pubblichi metadati in modo sicuro, vedere Endpoint di metadati protetto personalizzato.

Per ulteriori informazioni su pubblicazione di metadati nel codice, vedere Procedura: pubblicare metadati per un servizio utilizzando codice. La pubblicazione di metadati consente ai client di recuperare i metadati utilizzando una richiesta GET WS-Transfer o una richiesta HTTP/GET tramite la stringa di query ?wsdl. Per garantire il corretto funzionamento del codice, creare un servizio WCF di base. Per motivi di semplicità, nel codice seguente viene fornito un servizio indipendente di base.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(SimpleService),
                new Uri("https://localhost:8001/MetadataSample")); 
            try
            {
                // Open the service host to accept incoming calls
                host.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                host.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}

Si tratta di un servizio indipendente, configurato tramite un file di configurazione. Il file di configurazione seguente funge da punto di partenza.

<configuration>
  <system.serviceModel>
    <services>
      <service name="Metadata.Example.SimpleService">
        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="Metadata.Example.ISimpleService" />
      </service>
    </services>
    <behaviors>
      
    </behaviors>
  </system.serviceModel>
</configuration>

Per pubblicare metadati per un servizio WCF utilizzando un file di configurazione dell'applicazione

  1. Nel file App.config, dopo l'elemento di chiusura </services>, creare un elemento <behaviors>.

    <behaviors>
    
    </behaviors>
    
  2. Nell'elemento <behaviors> aggiungere un elemento <serviceBehaviors>.

    <behaviors>
      <serviceBehaviors>
    
      </serviceBehaviors>
    </behaviors>
    
  3. Aggiungere un elemento <behavior> all'elemento <serviceBehaviors> e specificare un valore per l'attributo name dell'elemento <behavior>.

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
    
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  4. Aggiungere un elemento <serviceMetadata> all'elemento <behavior>. Impostare l'attributo httpGetEnabled su true e l'attributo policyVersion su Policy15. httpGetEnabled consente al servizio di rispondere a richieste di metadati eseguite da una richiesta HTTP GET. policyVersion indica al servizio di conformarsi a WS-Policy 1.5 per la generazione di metadati.

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  5. Aggiungere un attributo behaviorConfiguration all'elemento <service> e specificare l'attributo name dell'elemento <behavior> aggiunto al passaggio 1, come illustrato nell'esempio di codice seguente.

    <services>
      <service
          name="Metadata.Example.SimpleService"
          behaviorConfiguration="SimpleServiceBehavior">
        ...
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  6. Aggiungere uno o più elementi <endpoint> con il contratto impostato su IMetadataExchange, come illustrato nell'esempio di codice seguente.

    <services>
      <service
          name="Metadata.Example.SimpleService"
          behaviorConfiguration="SimpleServiceBehavior">
    
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Metadata.Example.ISimpleService" />
    
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    
  7. Per gli endpoint dei metadati aggiunti nel passaggio precedente, impostare l'attributo binding su uno dei valori seguenti:

    • mexHttpBinding per la pubblicazione HTTP.

    • mexHttpsBinding per la pubblicazione HTTPS.

    • mexNamedPipeBinding per la pubblicazione named pipe.

    • mexTcpBinding per la pubblicazione TCP.

  8. Per gli endpoint dei metadati aggiunti in un passaggio precedente, impostare l'indirizzo su:

    • Una stringa vuota, per utilizzare l'indirizzo di base dell'applicazione host come punto di pubblicazione, se l'indirizzo di base corrisponde all'associazione di metadati.

    • Un indirizzo relativo, se l'applicazione host ha un indirizzo di base.

    • Un indirizzo assoluto.

  9. Compilare ed eseguire l'applicazione console.

  10. Utilizzare Internet Explorer per accedere all'indirizzo di base del servizio (https://localhost:8001/MetadataSample in questo esempio) e verificare che la pubblicazione dei metadati sia attivata. In caso contrario, all'inizio della pagina risultante verrà visualizzato il messaggio: "La pubblicazione dei metadati per il servizio è attualmente disabilitata".

Per utilizzare endpoint predefiniti

  1. Per configurare metadati in un servizio che utilizza endpoint predefiniti, specificare ServiceMetadataBehavior nel file di configurazione come nell'esempio precedente, senza però specificare alcun endpoint. Il file di configurazione sarà quindi simile al seguente.

    <configuration>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="SimpleServiceBehavior">
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
      </system.serviceModel>
    </configuration>
    

    Poiché il servizio ha un oggetto ServiceMetadataBehavior con httpGetEnabled impostato su true, per il servizio è abilitata la pubblicazione di metadati. Poiché, inoltre, non è stato aggiunto in modo esplicito alcun endpoint, il runtime aggiunge gli endpoint predefiniti. Per ulteriori informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Configurazione semplificata e Configurazione semplificata per servizi WCF.

Esempio

Nell'esempio di codice seguente vengono illustrati l'implementazione di un servizio WCF di base e il file di configurazione che pubblica i metadati per il servizio.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(SimpleService),
                new Uri("https://localhost:8001/MetadataSample")); 
            try
            {
                // Open the service host to accept incoming calls
                host.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                host.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Vedere anche

Attività

Procedura: ospitare un servizio WCF in un'applicazione gestita
Servizio indipendente
Procedura: pubblicare metadati per un servizio utilizzando codice

Riferimento

ServiceMetadataBehavior

Concetti

Panoramica dell'architettura dei metadati
Utilizzo di metadati