2010-07-20 7 views
12

Estoy usando WCF 4 en IIS 7.5 y quiero eliminar la extensión .svc predeterminada de la URL de todos mis servicios RESTful. He visto los enfoques documentados utilizando el Módulo de Reescritura de Url y un Módulo IHttp, pero no quiero tomar esos enfoques.¿Eliminar el .svc en la URL de un servicio WCF 4 utilizando Rutas?

Estoy vagamente familiarizado con el concepto de Rutas introducido en ASP.NET MVC y, como tengo entendido, ahora están abstraídos de MVC en Net 4 como System.Web.Routing. Pero al mirar los documentos, parece que necesito agregar un archivo Global.asax a mi proyecto, que no me gusta mucho. ¿Hay alguna otra forma de manejar esto?

También he visto la función de activación basada en la configuración, pero eso solo parece eliminar el archivo .svc, pero todavía necesito que use .svc en la url de mi servicio.

¿Alguien puede resumir mis opciones aquí para no necesitar .svc en mis direcciones URL?

Respuesta

9

Seguro, no hay problema: primero, lea todo sobre las nuevas características de WCF 4 en A Developer's Introduction to Windows Communication Foundation 4.

Lo que está buscando se llama activación del servicio sin archivos. Es un nuevo ajuste en su <system.serviceModel> que se ve algo como esto:

<serviceHostingEnvironment> 
    <serviceActivations> 
     <add factory="System.ServiceModel.Activation.ServiceHostFactory" 
      relativeAddress="/YourService" 
      service="SomeNamespace.YourService"/> 
    </serviceActivations> 
</serviceHostingEnvironment> 

Básicamente, toda la información que tendría en el archivo .svc * (ruta, el servicio para llamar) se encuentra en esta sección de configuración ahora.

Usted debe ser capaz de llamar a este servicio en

http://yourserver/virtualdirectory/YourService 

ahora - no más * .SVC, sin volver a escribir URL desordenado etc - Funciona igual de civil!

Actualización: Parece que no funciona tan bien, a menos que entre y agregue una extensión * .svc a su ruta de acceso relativa - ¡tipo derrota todo el propósito!

Si desea registrarse utilizando una ruta ASP.NET, consulte el MSDN docs sobre ese tema. Usted tendría que tener algo como esto en el inicio de la aplicación, en una aplicación web que sería global.asax.cs:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
} 

private void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Add(new ServiceRoute("YourService", 
       new WebServiceHostFactory(), typeof(SomeNamespace.YourService))); 
} 

Con suerte, con eso, usted será capaz de obtener su servicio en marcha y funcionando sin ningún * ¡extensiones de archivo .svc!

+0

Parece que estamos hablando acerca del uso de Configuración Basada activación (http: // MSDN .microsoft.com/es-us/library/ee358764.aspx) en lugar de System.Web.Routing. El problema es que parece que relativeAddress debe usar una extensión compatible con WCF (como .svc). No puedo hacer que funcione tu ejemplo, me sale el error: 'La dirección relativa registrada' YourService 'en la sección' system.serviceModel/serviceHostingEnvironment/serviceActivations 'en el archivo de configuración no tiene una extensión' – BrettRobi

+0

@BrettRobi: funny - that El artículo de MSDN se contradice ... y esto es contrario a todas las presentaciones y conversaciones que he visto/escuchado hasta el momento sobre la activación sin archivos ..... He actualizado mi respuesta de todos modos –

+2

Sí, tenía la esperanza de que lo hiciera hacer el truco, pero realmente parece una forma simple de eliminar el archivo .svc en sí, pero no la necesidad de .svc en la url. Gracias por la ayuda ... – BrettRobi

5

Solo para concluir la respuesta y agregar un punto más allí. Usted necesitará el mismo registro de rutas ASP.NET que el anterior:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
} 

private void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Add(new ServiceRoute("YourService", 
       new WebServiceHostFactory(), typeof(SomeNamespace.YourService))); 
} 

Con el fin de conseguir este trabajo, sin embargo es necesario agregar algunas cosas más para web.config. El servicio de alojamiento debe configurarse para ser compatible con ASP.NET. Esto puede hacerse mediante la adición de aspNetCompatibiliyEnabled = "true" al elemento serviceHostingEnvironment:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 

espero que esto aclara y da una solución más fácil de encontrar.

+1

Vea aquí por qué no debe usar WebServiceHostFactory, use solo ServiceHostFactory http://stackoverflow.com/questions/2921802/serviceroute-webservicehostfactory-kills-wsdl-generation-how-to-create-extens –

+0

@LuizFelipe, la pregunta a la que se refiere es para un servicio SOAP, no un servicio REST (WebHttp). Esta pregunta es para un servicio REST. WebServiceHostFactory ES la fábrica correcta en este caso. –

+0

Sí, cambiarlo para usar ServiceHostFactory resuelve el problema de enrutamiento, pero luego obtienes un servicio SOAP, tienes razón. Estaba equivocado, si la solución anterior no funciona, solo usa el enrutamiento URL. –

1

Importante aclaración para IIS 7.5 y Framework 4.0:

Para el módulo de enrutamiento Web funcione, se requiere el grupo de aplicaciones configurado en "modo integrado de", no funciona en "modo clásico"

Un problema adicional que he encontrado después de La conmutación es que cuando estaba en "Modo integrado", la aplicación se bloqueaba al inicio porque tenía módulos incluidos en el sistema < .Web> sección.

me fijo moviendo los módulos a la> sección de configuración < system.webServer que es nuevo para IIS 7

Cuestiones relacionadas