2010-05-27 16 views
21

Estoy intentando usar servicios WCF sin extensión/.svc-less. ¿Alguien más puede confirmar o negar el problema que estoy experimentando?ServiceRoute + WebServiceHostFactory mata la generación de WSDL? Cómo crear un servicio WCF sin extensión con? Wsdl

utilizo de enrutamiento en el código, y hacer esto en Application_Start de global.asax.cs:

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

He probado tanto en IIS 6 y IIS 7.5 y puedo utilizar el servicio bien (es decir, mi la configuración del controlador de asignación de comodines sin extensión apunta correctamente a ASP.NET). Sin embargo, la generación de metadatos está totalmente jodida. I puede pulse my/mex endpoint con WCF Test Client (y supongo svcutil.exe) - pero la generación de * wsdl que normalmente 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 lugar de utilizar el enrutamiento serviceActivation en la configuración de este tipo, en lugar de registrar una ruta de código:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <serviceActivations> 
    <add relativeAddress="Data.svc" service="DataDips" /> 
    </serviceActivations> 
</serviceHostingEnvironment> 

A continuación, voilá ... 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 he tratado de utilizar este código en conjunción con la configuración anterior:

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

Mi pensamiento es que solo puedo señalar la URL sin extensión en la dirección URL configurada .svc. Esto no funciona - el /Data.svc sigue trabajando, pero/datos devuelve un 404.

Lo que encontrar una solución alternativa si se utiliza urlMappings en la configuración de este tipo, en conjunción con serviceActivation arriba:

<urlMappings> 
    <add url="~/Data" mappedUrl="Data.svc"/> 
</urlMappings> 

el problema con esto es doble - 1. parece enrevesado 2. en el WSDL generado, los criterios de valoración de operación aún se refieren a Data.svc /, en lugar de datos/- por lo tanto, theres dependencia de Data.svc realmente existente/respondiendo.

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

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

+0

Paso a paso instrucciones aquí: http://stackoverflow.com/a/27850224/276949 –

Respuesta

35

Guau, me siento tonto.

Debí alojar mi servicio con ServiceHostFactory, NO WebServiceHostFactory.

Tan pronto como volví al código desde la configuración ...e intercambiarse para esta línea de código:

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

yo estaba en el negocio con una URL sin extensión servir las páginas de ayuda y WSDL.

Es una lástima lo 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 la eliminación de WSDL tiene sentido, pero la eliminación de las páginas de ayuda no es así, ya que simplemente podrían proporcionar un atributo de configuración para cambiar el nombre de la página de 'Ayuda' debe haber una operación de descanso con ese nombre ... suspiro).

hay una nota en la documentación WebServiceHost http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

+1

Aún es una pregunta válida. Acabo de hacer exactamente lo mismo, y encontré la respuesta aquí esperándome. ¡Gracias! –

+0

Sí, una pregunta válida. Yo quería hacer lo mismo y esto funcionó bien. – JTew

+5

Mi consejo ahora ... ¡zanja WCF! Es demasiado complicado con minas terrestres como esta en todo el lugar. Finalmente lo abandoné debido a todo el dolor innecesario que me causó a lo largo de los años, y no podría estar más feliz con lo que uso ahora. Estoy 100% detrás ServiceStack haberlo usado durante al menos un año - es genial, está limpio, tiene sentido cuando vuelva a visitar código antiguo, soporta múltiples formatos de serialización de la caja, ha COI organizó al horno en, acoge fácilmente dentro/fuera de IIS (incluido Mono), no te lanza al infierno de la configuración y se actualiza con frecuencia. –

0

Tengo un mismo tema. 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 " %> 

<script RunAt="server"> 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 

    private void RegisterRoutes(RouteCollection routes) 
    { 
     routes.Add(new ServiceRoute("URLWithoutSVC", new WebServiceHostFactory(), typeof(Service))); 
    } 
</script> 

Para

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

<script RunAt="server"> 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 

    private void RegisterRoutes(RouteCollection routes) 
    { 
     routes.Add(new ServiceRoute("URLWithoutSVC", new ServiceHostFactory(), typeof(Service))); 
    } 
</script> 
Cuestiones relacionadas