Vorgehensweise: Abrufen von Metadaten über eine Nicht-MEX-BindungHow to: Retrieve Metadata Over a non-MEX Binding

In diesem Thema wird beschrieben, wie Metadaten über eine Nicht-MEX-Bindung von einem MEX-Endpunkt abgerufen werden.This topic describes how to retrieve metadata from a MEX endpoint over a non-MEX binding. Der Code in diesem Beispiel basiert auf der benutzerdefinierter sicherer Metadatenendpunkt Beispiel.The code in this sample is based on the Custom Secure Metadata Endpoint sample.

So rufen Sie Metadaten über eine Nicht-MEX-Bindung abTo retrieve metadata over a non-MEX binding

  1. Bestimmen Sie die vom MEX-Endpunkt verwendete Bindung.Determine the binding used by the MEX endpoint. Für Windows Communication Foundation (WCF)-Dienste können Sie die MEX-Bindung ermitteln, durch den Zugriff auf die Konfigurationsdatei des Diensts.For Windows Communication Foundation (WCF) services, you can determine the MEX binding by accessing the service's configuration file. In diesem Fall wird die MEX-Bindung in der folgenden Dienstkonfiguration definiert.In this case, the MEX binding is defined in the following service configuration.

    <services>  
        <service name="Microsoft.ServiceModel.Samples.CalculatorService"  
                behaviorConfiguration="CalculatorServiceBehavior">  
         <!-- Use the base address provided by the host. -->  
         <endpoint address=""  
           binding="wsHttpBinding"  
           bindingConfiguration="Binding2"  
           contract="Microsoft.ServiceModel.Samples.ICalculator" />  
         <endpoint address="mex"  
           binding="wsHttpBinding"  
           bindingConfiguration="Binding1"  
           contract="IMetadataExchange" />  
         </service>  
     </services>  
     <bindings>  
       <wsHttpBinding>  
         <binding name="Binding1">  
           <security mode="Message">  
             <message clientCredentialType="Certificate" />  
           </security>  
         </binding>  
         <binding name="Binding2">  
           <reliableSession inactivityTimeout="00:01:00" enabled="true" />  
           <security mode="Message">  
             <message clientCredentialType="Certificate" />  
           </security>  
         </binding>  
       </wsHttpBinding>  
     </bindings>  
    
  2. Konfigurieren Sie in der Clientkonfigurationsdatei die gleiche benutzerdefinierte Bindung.In the client configuration file, configure the same custom binding. Hier definiert der Client auch ein clientCredentials-Verhalten, um ein Zertifikat bereitzustellen, das beim Abrufen von Metadaten vom MEX-Endpunkt für die Authentifizierung am Dienst verwendet wird.Here the client also defines a clientCredentials behavior to provide a certificate to use to authenticate to the service when requesting metadata from the MEX endpoint. Wenn Sie „Svcutil.exe“ zum Anfordern von Metadaten über eine benutzerdefinierte Bindung verwenden, sollten Sie die MEX-Endpunktkonfiguration der Konfigurationsdatei für „Svcutil.exe“ (Svcutil.exe.config) hinzufügen. Der Name der Endpunktkonfiguration sollte dann mit dem URI-Schema der MEX-Endpunktadresse übereinstimmen, wie im folgenden Code dargestellt:When using Svcutil.exe to request metadata over a custom binding, you should add the MEX endpoint configuration to the configuration file for Svcutil.exe (Svcutil.exe.config), and the name of the endpoint configuration should match the URI scheme of the address of the MEX endpoint, as shown in the following code.

    <system.serviceModel>  
      <client>  
        <endpoint name="http"  
                  binding="wsHttpBinding"  
                  bindingConfiguration="Binding1"  
                  behaviorConfiguration="ClientCertificateBehavior"  
                  contract="IMetadataExchange" />  
      </client>  
      <bindings>  
        <wsHttpBinding>  
          <binding name="Binding1">  
            <security mode="Message">  
              <message clientCredentialType="Certificate"/>  
            </security>  
          </binding>  
        </wsHttpBinding>  
      </bindings>  
      <behaviors>  
        <endpointBehaviors>  
          <behavior name="ClientCertificateBehavior">  
            <clientCredentials>  
              <clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />  
              <serviceCertificate>  
                <authentication certificateValidationMode="PeerOrChainTrust" />  
              </serviceCertificate>  
            </clientCredentials>  
          </behavior>  
        </endpointBehaviors>  
      </behaviors>    
    </system.serviceModel>  
    
  3. Erstellen Sie einen MetadataExchangeClient, und rufen Sie GetMetadata auf.Create a MetadataExchangeClient and call GetMetadata. Dazu stehen zwei Methoden zur Verfügung: Sie können die benutzerdefinierte Bindung in der Konfiguration angeben oder die benutzerdefinierte Bindung im Code, wie im folgenden Beispiel gezeigt:There are two ways to do this: you can specify the custom binding in configuration, or you can specify the custom binding in code, as shown in the following example.

    // The custom binding is specified in configuration.  
    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/mex");  
    
    MetadataExchangeClient mexClient = new MetadataExchangeClient("http");  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet mexSet = mexClient.GetMetadata(mexAddress);  
    
    // The custom binding is specified in code.  
    // Specify the Metadata Exchange binding and its security mode.  
    WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);  
    mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;  
    
    // Create a MetadataExchangeClient and set the certificate details.  
    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);  
    mexClient.SoapCredentials.ClientCertificate.SetCertificate(  
        StoreLocation.CurrentUser, StoreName.My,  
        X509FindType.FindBySubjectName, "client.com");  
    mexClient.SoapCredentials.ServiceCertificate.Authentication.  
        CertificateValidationMode =  
        X509CertificateValidationMode.PeerOrChainTrust;  
    mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate(  
        StoreLocation.CurrentUser, StoreName.TrustedPeople,  
        X509FindType.FindBySubjectName, "localhost");  
    MetadataExchangeClient mexClient2 = new MetadataExchangeClient(customBinding);  
    mexClient2.ResolveMetadataReferences = true;  
    MetadataSet mexSet2 = mexClient2.GetMetadata(mexAddress);  
    
  4. Erstellen Sie ein WsdlImporter-Element, und rufen Sie ImportAllEndpoints auf, wie im folgenden Code gezeigt.Create a WsdlImporter and call ImportAllEndpoints, as shown in the following code.

    WsdlImporter importer = new WsdlImporter(mexSet);  
    ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();  
    
  5. An diesem Punkt verfügen Sie über eine Auflistung von Dienstendpunkten.At this point, you have a collection of service endpoints. Weitere Informationen zum Importieren von Metadaten finden Sie unter Vorgehensweise: Importieren von Metadaten in Dienstendpunkte.For more information about importing metadata, see How to: Import Metadata into Service Endpoints.

Siehe auchSee Also

MetadatenMetadata