Comportamento di pubblicazione dei metadati

L’esempio Metadati illustra come controllare le funzionalità di pubblicazione dei metadati di un servizio. Per impedire la divulgazione involontaria dei metadati del servizio potenzialmente sensibili, la configurazione predefinita per i servizi Windows Communication Foundation (WCF) disabilita la pubblicazione dei metadati. Questo comportamento è protetto per impostazione predefinita, ma significa inoltre che non è possibile usare uno strumento di importazione di metadati (ad esempio Svcutil.exe) per generare il codice client necessario per chiamare il servizio, a meno che il comportamento di pubblicazione dei metadati del servizio non venga abilitato in modo esplicito in fase di configurazione.

Importante

Per maggior chiarezza, questo esempio illustra come creare un endpoint non protetto per la configurazione di metadati. Tali endpoint sono potenzialmente disponibili per utenti anonimi non autenticati e bisogna prestare attenzione prima di distribuirli, al fine di garantire che la pubblicazione dei metadati di un servizio sia appropriata. Vedere endpoint di metadati protetto personalizzato per un esempio che protegge un endpoint di metadati.

L'esempio si basa su Introduzione, che implementa il contratto di servizio ICalculator. In questo esempio, il client è un'applicazione console (.exe) e il servizio è ospitato da Internet Information Services (IIS).

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.

Affinché un servizio esponga metadati, la classe ServiceMetadataBehavior deve essere configurata nel servizio. Quando questo comportamento è presente, è possibile pubblicare metadati configurando un endpoint per esporre il contratto IMetadataExchange come un'implementazione di un protocollo WS-MetadataExchange (MEX). Per convenienza, a questo contratto è stato dato il nome di configurazione abbreviato seguente: "IMetadataExchange." In questo esempio viene utilizzata l'associazione mexHttpBinding, ovvero un'utile associazione standard equivalente all'associazione wsHttpBinding con la modalità di sicurezza impostata su None. Nell'endpoint viene usato un indirizzo relativo "mex", che quando viene risolto rispetto all'indirizzo di base dei servizi restituisce un indirizzo endpoint di http://localhost/servicemodelsamples/service.svc/mex. Di seguito viene illustrata la configurazione del comportamento:

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Di seguito viene illustrato l'endpoint MEX.

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

Questo esempio imposta la proprietà HttpGetEnabled su true, che espone anche i metadati del servizio utilizzando HTTP GET. Per abilitare un endpoint di metadati HTTP GET, il servizio deve avere un indirizzo di base HTTP. La stringa di query ?wsdl viene utilizzata sull'indirizzo di base del servizio per accedere ai metadati. Ad esempio, per visualizzare il file WSDL per il servizio in un Web browser, usare l'indirizzo http://localhost/servicemodelsamples/service.svc?wsdl. In alternativa, è possibile utilizzare questo comportamento per esporre metadati su HTTP impostando HttpsGetEnabled su true. Ciò richiede un indirizzo di base HTTP.

Per accedere all'endpoint MEX del servizio, usare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe).

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

Ciò genera un client basato sui metadati del servizio.

Per accedere ai metadati del servizio tramite HTTP GET, puntare il browser su http://localhost/servicemodelsamples/service.svc?wsdl.

Se si rimuove questo comportamento e si tenta di aprire il servizio si otterrà un'eccezione. Questo errore si verifica perché senza il comportamento, l'endpoint configurato con il contratto IMetadataExchange non viene implementato.

Se si imposta HttpGetEnabled su false, si vede la pagina della Guida di CalculatorService invece dei metadati del servizio.

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di aver eseguito la Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.

  3. Per eseguire l'esempio in un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.