Comportamento di pubblicazione dei metadati

L'esempio Comportamento di pubblicazione dei metadati illustra come controllare le caratteristiche di pubblicazione dei metadati di un servizio. Per impedire la rivelazione non intenzionale di metadati del servizio potenzialmente riservati, la configurazione predefinita per i servizi Windows Communication Foundation (WCF) disattiva la pubblicazione dei metadati. Questo comportamento è protetto per impostazione predefinita, ma significa inoltre che non è possibile utilizzare 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 del servizio di pubblicazione dei metadati non venga attivato in modo esplicito in fase di configurazione.

Nota

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 anonimi e bisogna fare attenzione prima di distribuirli per garantire che la pubblicazione dei metadati di un servizio sia appropriata. Vedere l'esempio Endpoint di metadati protetto personalizzato per un esempio di protezione di un endpoint di metadati.

L'esempio si basa su Esempio della guida introduttiva, 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 protezione impostata su None. Nell'endpoint viene utilizzato un indirizzo relativo "mex" che, quando risolto rispetto all'indirizzo di base dei servizi, produce l'indirizzo di endpoint "https://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,
             https://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 
           https://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 trueche 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 vedere il linguaggio WSDL del servizio in un browser Web si utilizzerebbe l'indirizzo https://localhost/servicemodelsamples/service.svc? il 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 utilizzareService Model Metadata Utility Tool (Svcutil.exe).

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

Ciò genera un client basato sui metadati del servizio.

Per accedere ai metadati del servizio utilizzando HTTP GET, puntare il browser su https://localhost/servicemodelsamples/service.svc? il 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 Generazione degli esempi Windows Communication Foundation.

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

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.