Condividi tramite


Procedura: recuperare metadati e implementare un servizio conforme

Spesso i servizi non vengono progettati e implementati dalla stessa persona. Negli ambienti dove le applicazioni interoperative svolgono un ruolo importante, i contratti possono essere progettati o descritti in WSDL (Web Services Description Language) e uno sviluppatore deve implementare un servizio che sia conforme al contratto fornito. In alcuni casi può essere necessario eseguire la migrazione di un servizio esistente a Windows Communication Foundation (WCF) mantenendo tuttavia il formato di trasmissione. I contratti duplex richiedono inoltre ai chiamanti di implementare anche un contratto di callback.

In questi casi è necessario utilizzare Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) (o un strumento equivalente) per generare un'interfaccia del contratto di servizio in un linguaggio gestito che possa essere implementata per soddisfare i requisiti del contratto. In genere Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) viene utilizzato per acquisire un contratto di servizio utilizzato con una channel factory o un tipo di client WCF nonché con un file di configurazione client che configura l'associazione e l'indirizzo corretti. Per utilizzare il file di configurazione generato, è necessario modificarlo in un file di configurazione del servizio. Può inoltre essere necessario modificare il contratto di servizio.

Per recuperare dati e implementare un servizio conforme

  1. Utilizzare Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) in file di metadati o in un endpoint dei metadati per generare un file di codice.

  2. Cercare la parte del file di codice di output che contiene l'interfaccia desiderata (nel caso siano presenti più interfacce) contrassegnata con l'attributo System.ServiceModel.ServiceContractAttribute. L'esempio di codice seguente mostra le due interfacce generate da Strumento ServiceModel Metadata Utility Tool (Svcutil.exe). La prima (ISampleService) è l'interfaccia del contratto di servizio che viene implementata per creare un servizio conforme. La seconda (ISampleServiceChannel) è un'interfaccia di supporto utilizzata dal client che estende sia l'interfaccia del contratto di servizio che l'interfaccia System.ServiceModel.IClientChannel e che viene utilizzata in un'applicazione client.

  3. Se la descrizione WSDL non specifica un'azione di replica per tutte le operazioni, è possibile che la proprietà ReplyAction dei contratti di operazione generati sia impostata sul carattere jolly (*). Rimuovere l'impostazione di questa proprietà. In caso contrario, quando vengono implementati i metadati del contratto di servizio, i metadati non possono essere esportati per tali operazioni.

  4. Implementare l'interfaccia in una classe e ospitare il servizio. Per un esempio, vedere Procedura: implementare un contratto di servizio di Windows Communication Foundation oppure una semplice implementazione riportata di seguito nella sezione relativa agli esempi.

  5. Nel file di configurazione del client generato da Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) modificare la sezione di configurazione <client><services> sostituendola con una sezione di configurazione. Per un esempio di file di configurazione dell'applicazione client generato, vedere la sezione "Esempio" seguente.

  6. All'interno della sezione di configurazione <services>name creare l'attributo <services> nella sezione di configurazione per l'implementazione del servizio.

  7. Impostare l'attributo name del servizio sul nome di configurazione da assegnare all'implementazione del servizio.

  8. Aggiungere gli elementi della configurazione endpoint che utilizzano il contratto di servizio implementato alla sezione di configurazione del servizio.

Esempio

L'esempio di codice seguente mostra la maggior parte di un file di codice generato eseguendo Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) in file di metadati.

Il codice seguente include:

  • L'interfaccia del contratto di servizio che, quando implementata, è conforme ai requisiti del contratto (ISampleService).

  • L'interfaccia di supporto utilizzata dal client che estende sia l'interfaccia del contratto di servizio che l'interfaccia System.ServiceModel.IClientChannel e che viene utilizzata in un'applicazione client (ISampleServiceChannel).

  • La classe di supporto che estende System.ServiceModel.ClientBase e che deve essere utilizzata in un'applicazione client (SampleServiceClient).

  • Il file di configurazione generato dal servizio.

  • Una semplice implementazione del servizio ISampleService.

  • Una conversione del file di configurazione lato client in una versione lato servizio.

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
                name="BasicHttpBinding_ISampleService" />
        </client>
    </system.serviceModel>
</configuration>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service
          name="Microsoft.WCF.Documentation.SampleService">
        <endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
            />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Vedere anche

Concetti

Strumento ServiceModel Metadata Utility Tool (Svcutil.exe)