Procedimiento para publicar metadatos para un servicio mediante un archivo de configuración
Este es uno de los dos temas de procedimientos que muestran la publicación de metadatos para un servicio Windows Communication Foundation (WCF). Hay dos maneras de especificar cómo debería publicar metadatos un servicio: mediante un archivo de configuración y mediante código. En este tema se muestra cómo publicar metadatos para un servicio mediante un archivo de configuración.
Precaución
En este tema se muestra cómo publicar metadatos de forma no segura. Cualquier cliente puede recuperar los metadatos del servicio. Si el servicio necesita publicar metadatos de forma segura, consulte Punto de conexión de metadatos seguro personalizado.
Para obtener más información sobre la publicación de metadatos en código, consulte Procedimiento para publicar metadatos para un servicio mediante código. La publicación de metadatos permite a los clientes recuperar los metadatos mediante una solicitud GET WS-Transfer o mediante una solicitud HTTP/GET usando la cadena de solicitud ?wsdl
. Para asegurarse de que el código funciona, cree un servicio WCF básico. Para simplificar, se proporciona un servicio autohospedado básico en el código siguiente.
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();
}
}
}
}
Este servicio es un servicio autohospedado que se configura usando un archivo de configuración. El archivo de configuración siguiente sirve de punto de partida.
<configuration>
<system.serviceModel>
<services>
<service name="Metadata.Example.SimpleService">
<endpoint address=""
binding="basicHttpBinding"
contract="Metadata.Example.ISimpleService" />
</service>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Publicación de metadatos para un servicio WCF mediante un archivo de configuración
Dentro del archivo App.config, después del elemento
</services>
de cierre, cree un elemento<behaviors>
.En el elemento
<behaviors>
, agregue un elemento<serviceBehaviors>
.Agregue un elemento
<behavior>
al elemento<serviceBehaviors>
y especifique un valor para el atributoname
del elemento<behavior>
.Agregue un elemento
<serviceMetadata>
al elemento<behavior>
. Establezca el atributohttpGetEnabled
entrue
y el atributopolicyVersion
en Policy15.httpGetEnabled
permite que el servicio responda a las solicitudes de metadatos realizadas por una solicitud HTTP GET.policyVersion
indica al servicio que se ajuste a WS-Policy 1.5 al generar los metadatos.Agregue un atributo
behaviorConfiguration
al elemento<service>
y especifique el atributoname
del elemento<behavior>
agregado en el paso 1, como se muestra en el siguiente código de ejemplo.<services> <service name="Metadata.Example.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> ... </service> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> </behavior> </serviceBehaviors> </behaviors>
Agregue uno o varios elementos
<endpoint>
con el contrato establecido enIMetadataExchange
, como se muestra en el código de ejemplo siguiente.<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>
Para los puntos de conexión de metadatos agregados en el paso anterior, establezca el atributo
binding
en uno de los siguientes valores:mexHttpBinding
para la publicación HTTP.mexHttpsBinding
para la publicación HTTPS.mexNamedPipeBinding
para la publicación de la canalización con nombre.mexTcpBinding
para la publicación TCP.
Para los puntos de conexión de metadatos agregados en un paso anterior, establezca la dirección en:
Una cadena vacía para utilizar la dirección base de la aplicación host como el punto de publicación si la dirección base es igual que el enlace de los metadatos.
Una dirección relativa si la aplicación host tiene una dirección base.
Una dirección absoluta.
Compilación y ejecución de la aplicación de consola.
Vaya a la dirección base del servicio (
http://localhost:8001/MetadataSample
en este ejemplo) y compruebe que la publicación de metadatos esté activada. Si no, un mensaje en la parte superior de la página resultante muestra: "La publicación de metadatos para este servicio está deshabilitad actualmente".
Para usar puntos de conexión predeterminados
Para configurar metadatos en un servicio que usa puntos de conexión predeterminados, especifique el ServiceMetadataBehavior en el archivo de configuración como en el ejemplo anterior, pero no especifique ningún punto de conexión. El archivo de configuración debería tener el aspecto siguiente.
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Dado que el servicio tiene un ServiceMetadataBehavior con
httpGetEnabled
establecido entrue
, el servicio tiene metadatos de publicación habilitados y como no se agregó ningún punto de conexión explícitamente, el tiempo de ejecución agrega los puntos de conexión predeterminados. Para obtener más información sobre los puntos de conexión, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.
Ejemplo
En el siguiente ejemplo de código se muestra la implementación de un servicio WCF básico y el archivo de configuración que publica los metadatos del servicio.
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>