Dela via


Anvisningar: Publicera metadata för en tjänst med hjälp av en konfigurationsfil

Det här är ett av två instruktioner som visar publicering av metadata för en WCF-tjänst (Windows Communication Foundation). Det finns två sätt att ange hur en tjänst ska publicera metadata med hjälp av en konfigurationsfil och med hjälp av kod. Det här avsnittet visar hur du publicerar metadata för en tjänst med hjälp av en konfigurationsfil.

Varning

Det här avsnittet visar hur du publicerar metadata på ett osäkert sätt. Alla klienter kan hämta metadata från tjänsten. Om du kräver att din tjänst publicerar metadata på ett säkert sätt kan du läsa Slutpunkten för anpassade säkra metadata.

Mer information om hur du publicerar metadata i kod finns i Publicera metadata för en tjänst med hjälp av kod. Med publiceringsmetadata kan klienter hämta metadata med hjälp av en GET-begäran för WS-överföring eller en HTTP/GET-begäran med hjälp av frågesträngen ?wsdl . För att vara säker på att koden fungerar skapar du en grundläggande WCF-tjänst. För enkelhetens skull tillhandahålls en grundläggande lokalt installerad tjänst i följande kod.

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("http://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();  
            }  
        }  
    }  
}  

Den här tjänsten är en lokalt installerad tjänst som konfigureras med hjälp av en konfigurationsfil. Följande konfigurationsfil fungerar som utgångspunkt.

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

Publicera metadata för en WCF-tjänst med hjälp av en programkonfigurationsfil

  1. Skapa ett <behaviors> element efter det avslutande </services> elementet i filen App.config.

  2. Lägg till ett <serviceBehaviors> element i elementet<behaviors>.

  3. Lägg till ett <behavior> element i elementet <serviceBehaviors> och ange ett värde för name elementets <behavior> attribut.

  4. Lägg till ett <serviceMetadata> element i elementet <behavior> . httpGetEnabled Ange attributet till true och policyVersion attributet till Policy15. httpGetEnabled tillåter tjänsten att svara på metadatabegäranden som görs av en HTTP GET-begäran. policyVersion instruerar tjänsten att följa WS-Policy 1.5 när metadata genereras.

  5. Lägg till ett behaviorConfiguration attribut i elementet <service> och ange name attributet för elementet <behavior> som lades till i steg 1, enligt följande kodexempel.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. Lägg till ett eller flera <endpoint> element med kontraktet inställt på IMetadataExchange, enligt följande kodexempel.

    <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. För metadataslutpunkterna som lades till i föregående steg anger du binding attributet till något av följande:

    • mexHttpBinding för HTTP-publicering.

    • mexHttpsBinding för HTTPS-publicering.

    • mexNamedPipeBinding för namngiven rörpublikation.

    • mexTcpBinding för TCP-publicering.

  8. För metadataslutpunkterna som lades till i ett tidigare steg anger du adressen som är lika med:

    • En tom sträng för att använda värdprogrammets basadress som publikationsplats om basadressen är samma som metadatabindningen.

    • En relativ adress om värdprogrammet har en basadress.

    • En absolut adress.

  9. Skapa och kör konsolprogrammet.

  10. Bläddra till basadressen för tjänsten (http://localhost:8001/MetadataSample i det här exemplet) och kontrollera att metadatapublicering är aktiverat. Annars visas ett meddelande överst på den resulterande sidan: "Metadatapublicering för den här tjänsten är för närvarande inaktiverad."

Så här använder du standardslutpunkter

  1. Om du vill konfigurera metadata för en tjänst som använder standardslutpunkter anger du ServiceMetadataBehavior i konfigurationsfilen som i föregående exempel, men anger inga slutpunkter. Konfigurationsfilen skulle då se ut så här.

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

    Eftersom tjänsten har värdet ServiceMetadataBehaviorhttpGetEnabledtruehar tjänsten publiceringsmetadata aktiverad, och eftersom inga slutpunkter uttryckligen har lagts till lägger körningen till standardslutpunkterna. Mer information om standardslutpunkter, bindningar och beteenden finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.

Exempel

I följande kodexempel visas implementeringen av en grundläggande WCF-tjänst och konfigurationsfilen som publicerar metadata för tjänsten.

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("http://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>  

Se även