ServiceRoute + WebServiceHostFactory mata la generación WSDL? Cómo crear un servicio WCF sin extensión con? Wsdl

Estoy intentando usar servicios WCF sin extensión / .svc-less. ¿Alguien más puede confirmar o negar el problema que estoy experimentando?

Uso el enrutamiento en el código y hago esto en Application_Start of global.asax.cs:

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips))); 

He probado tanto en IIS 6 como en IIS 7.5 y puedo usar el servicio muy bien (es decir, mi configuración de controlador de asignación de comodines sin extensión apunta correctamente a ASP.NET). Sin embargo, la generación de metadatos está totalmente jodida. Puedo golpear mi punto final / mex con WCF Test Client (y supongo svcutil.exe), pero la generación de wsdl que normalmente se obtiene con .svc es tostada. No puedo presionarlo con un navegador (obtener 400 solicitudes incorrectas), no puedo usar wsdl.exe, etc. La generación de metadatos se configura correctamente en web.config.

Esto es un problema, por supuesto, porque el servicio se expone como basicHttpBinding para que un cliente ASMX antiguo pueda acceder a él. Pero, por supuesto, el cliente no puede generar el proxy sin una descripción WSDL.

Si, en cambio, utilizo el enrutamiento serviceActivation en una configuración como esta, en lugar de registrar una ruta en el código:

      

Entonces voila … funciona.

Pero entonces no tengo una url limpia sin extensión. Si cambio relativeAddress de Data.svc a Data, entonces obtengo una excepción de configuración ya que esto no es compatible con config. (Debe usar una extensión registrada en WCF).

También intenté usar este código junto con la configuración anterior:

 RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false); 

Mi opinión es que puedo apuntar la url sin extensión a la url .svc configurada. Esto no funciona: el /Data.svc continúa funcionando, pero / Data devuelve un 404.

Encontré una solución temporal si utilizo urlMappings en una configuración como esta, junto con serviceActivation anterior:

    

El problema con esto es doble: 1. Parece enrevesado 2. En el WSDL generado, los puntos finales de la operación aún se refieren a Data.svc /, en lugar de a Data / – por lo tanto, existe dependencia de Data.svc realmente existente / que responde.

Esto no es realmente lo que quiero, incluso si algo resuelve el problema.

¿Existe una forma adecuada de obtener URL de servicio WCF sin extensión para generar WSDL correctamente?

Wow, me siento tonto.

Debería haber alojado mi servicio con ServiceHostFactory, NO WebServiceHostFactory.

Tan pronto como volví al código desde la configuración … y cambié a esta línea de código:

 RouteTable.Routes.Add(new ServiceRoute("Data", new ServiceHostFactory(), typeof(DataDips))); 

Estaba en el negocio con una URL sin extensión que sirve WSDL y páginas de ayuda.

Es una lástima que haya perdido tanto tiempo en esto. Fue un accidente que estaba usando WebServiceHostFactory, pero no hay una exención de responsabilidad en la página de fábrica en MSDN sobre la funcionalidad reducida. (Yo diría que eliminar WSDL tiene sentido, pero eliminar las páginas de Ayuda no lo hace, ya que podrían simplemente proporcionar un atributo en config para renombrar la página ‘Ayuda’ si hubiera una operación REST con ese nombre … suspiro).

Hay una nota en los documentos de WebServiceHost http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

Tengo el mismo problema. Tu solución funciona en mi código. Acabo de cambiar el Global.asax así:

 <%@ Application Language="C#" %> <%@ Import Namespace="System.Web.Routing" %> <%@ Import Namespace="System.ServiceModel.Activation" %> <%@ Import Namespace="System.ServiceModel.Web " %>  

A

 <%@ Application Language="C#" %> <%@ Import Namespace="System.Web.Routing" %> <%@ Import Namespace="System.ServiceModel.Activation" %> <%@ Import Namespace="System.ServiceModel.Web " %>