example - Ocultar punto final REST de MEX/WSDL en WCF
wcf web service (3)
Puede obtener una copia del WSDL, editarla manualmente para eliminar artefactos no deseados y almacenarla en una ubicación conocida. Una vez que tenga la versión de su WSDL que elimina artefactos no deseados, puede redirigir la consulta de wsdl a esa ubicación:
<behaviors>
<serviceBehaviors>
<behavior name="TestServiceBehavior">
<serviceMetadata httpGetEnabled="True" externalMetadataLocation="http://localhost/TestService.wsdl"/>
</behavior>
</serviceBehaviors>
</behaviors>
Un par de advertencias sobre esta solución. Tienes que tener cuidado con lo que editas. Si cambia los aspectos críticos del contrato, es posible que WCF no pueda gestionar los mensajes de los clientes generados a partir de él. La eliminación de un punto final generalmente no es un gran problema, sin embargo cambiar los nombres de enlaces, operaciones, tipos de mensajes, etc. puede causar problemas.
También necesita estar al tanto de las importaciones. El WSDL generado por WCF generalmente define los puntos finales, luego importa otro .wsdl que define el contrato de servicio real. El contrato de servicio wsdl in tern generalmente importa varios archivos .xsd que definen su mensaje y tipos de datos. Deberá asegurarse de tener copias de estas cargadas relativas a la raíz .wsdl, y de actualizar los elementos de importación para hacer referencia a ellas de manera adecuada.
Otro problema con esto es que ahora está controlando manualmente su contrato ... lo que significa que si lo cambia, debe editarlo nuevamente y reemplazarlo en el sitio en el que esté alojando el archivo .wsdl. Ahora, un contrato diseñado adecuadamente NUNCA debe cambiar, ya que rompe una de las reglas fundamentales de SOA sobre los servicios web. Sin embargo, parece que está haciendo un desarrollo de código primero, por lo que es algo a tener en cuenta.
Tengo un servicio WCF que tiene extremos REST y SOAP para cada servicio. Esto se implementó de forma similar a esta publicación: extremos de REST / SOAP para un servicio de WCF con una configuración similar a la siguiente:
<services>
<service name="TestService">
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="rest" binding="webHttpBinding" contract="ITestService"/>
</service>
</services>
El problema es que el punto final REST aparece en el WSDL resultante como un puerto adicional y enlace.
¿Hay alguna forma de evitar que el punto final REST se incluya en el WSDL?
Sería bueno si hubiera un atributo para decorar el punto final para que esté oculto de la generación de mex / wsdl en las versiones futuras de WCF por exactamente esta razón (ocultando servicios tranquilos de los clientes de soap).
Encontré una forma decente para hacer esto usando IWsdlExportExtension
. Probablemente haya una forma más robusta / reutilizable para hacer esto, pero esta solución requiere la convención de que todos los puntos finales REST se denominen "REST". A continuación se muestra la parte relevante de un comportamiento de punto final asociado a todos los puntos finales REST:
public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
{
// Remove all REST references (binding & port) from SOAP WSDL
foreach (ServiceDescription wsdl in exporter.GeneratedWsdlDocuments)
{
// Remove REST bindings
foreach (Binding binding in wsdl.Bindings)
{
if (binding.Name == "REST")
{
wsdl.Bindings.Remove(binding);
break;
}
}
// Remove REST ports
foreach (Service service in wsdl.Services)
{
foreach (Port port in service.Ports)
{
if (port.Name == "REST")
{
service.Ports.Remove(port);
break;
}
}
}
}
}