Procedura: pubblicare metadati per un servizio usando un file di configurazione
Si tratta di uno dei due argomenti relativi alla procedura che illustrano la pubblicazione di metadati per un servizio Windows Communication Foundation (WCF). Esistono due modi per specificare come un servizio dovrebbe pubblicare metadati: usando un file di configurazione o il codice. In questo argomento viene illustrato come pubblicare metadati per un servizio usando un file di configurazione.
Attenzione
In questo argomento viene illustrato come pubblicare metadati in modo non sicuro. Qualsiasi client può recuperare i metadati dal servizio. Se è necessario che il servizio pubblicherà i metadati in modo sicuro, vedere Endpoint di metadati protetto personalizzato.
Per altre informazioni sulla pubblicazione di metadati nel codice, vedere Procedura: Pubblicare metadati per un servizio tramite codice. La pubblicazione di metadati consente ai client di recuperare i metadati usando una richiesta GET WS-Transfer o una richiesta HTTP/GET tramite la stringa di query ?wsdl
. Per assicurarsi che il codice funzioni, creare un servizio WCF di base. Per motivi di semplicità, nel codice seguente viene fornito un servizio indipendente di base.
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();
}
}
}
}
Si tratta di un servizio indipendente, configurato tramite un file di configurazione. Il file di configurazione seguente funge da punto di partenza.
<configuration>
<system.serviceModel>
<services>
<service name="Metadata.Example.SimpleService">
<endpoint address=""
binding="basicHttpBinding"
contract="Metadata.Example.ISimpleService" />
</service>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Per pubblicare metadati per un servizio WCF usando un file di configurazione dell'applicazione
Nel file App.config, dopo l'elemento di chiusura
</services>
, creare un elemento<behaviors>
.All'interno dell'elemento
<behaviors>
aggiungere un elemento<serviceBehaviors>
.Aggiungere un elemento
<behavior>
all'elemento<serviceBehaviors>
e specificare un valore per l'attributoname
dell'elemento<behavior>
.Aggiungere un elemento
<serviceMetadata>
all'elemento<behavior>
. Impostare l'attributohttpGetEnabled
sutrue
e l'attributopolicyVersion
su Policy15.httpGetEnabled
consente al servizio di rispondere a richieste di metadati eseguite da una richiesta HTTP GET.policyVersion
indica al servizio di conformarsi a WS-Policy 1.5 per la generazione di metadati.Aggiungere un attributo
behaviorConfiguration
all'elemento<service>
e specificare l'attributoname
dell'elemento<behavior>
aggiunto al passaggio 1, come illustrato nell'esempio di codice seguente.<services> <service name="Metadata.Example.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> ... </service> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Aggiungere uno o più elementi
<endpoint>
con il contratto impostato suIMetadataExchange
, come illustrato nell'esempio di codice seguente.<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>
Per gli endpoint dei metadati aggiunti nel passaggio precedente, impostare l'attributo
binding
su uno dei valori seguenti:mexHttpBinding
per la pubblicazione HTTP.mexHttpsBinding
per la pubblicazione HTTPS.mexNamedPipeBinding
per la pubblicazione named pipe.mexTcpBinding
per la pubblicazione TCP.
Per gli endpoint dei metadati aggiunti in un passaggio precedente, impostare l'indirizzo su:
Una stringa vuota, per usare l'indirizzo di base dell'applicazione host come punto di pubblicazione, se l'indirizzo di base corrisponde all'associazione di metadati.
Un indirizzo relativo, se l'applicazione host ha un indirizzo di base.
Un indirizzo assoluto.
Compilare ed eseguire l'applicazione console.
Passare all'indirizzo di base del servizio (
http://localhost:8001/MetadataSample
in questo esempio) e verificare che la pubblicazione dei metadati sia attivata. Se così non fosse, all'inizio della pagina risultante verrà visualizzato il messaggio: "La pubblicazione dei metadati per il servizio è attualmente disabilitata".
Per usare endpoint predefiniti
Per configurare metadati in un servizio che usa endpoint predefiniti, specificare ServiceMetadataBehavior nel file di configurazione come nell'esempio precedente, senza però specificare alcun endpoint. Il file di configurazione sarà quindi simile al seguente.
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Poiché il servizio ha ServiceMetadataBehavior con
httpGetEnabled
impostato sutrue
, per il servizio è abilitata la pubblicazione di metadati. Poiché, inoltre, non è stato aggiunto in modo esplicito alcun endpoint, il runtime aggiunge gli endpoint predefiniti. Per altre informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Simplified Configuration (Configurazione semplificata) e Simplified Configuration for WCF Services (Configurazione semplificata per servizi WCF).
Esempio
Nell'esempio di codice seguente vengono illustrati l'implementazione di un servizio WCF di base e il file di configurazione che pubblica i metadati per il servizio.
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>