2010-04-08 19 views
7

Estaba buscando una forma de enrutar http://www.example.com/WebService.asmx a http://www.example.com/service/ usando solo el marco de enrutamiento de ASP.NET 3.5 sin necesidad de configurar el servidor IIS.Asp.Net 3.5 ¿Enrutamiento al servicio web?

Hasta ahora he hecho lo que me dijeron que la mayoría de los tutoriales, añaden una referencia al ensamblado de enrutamiento, material configurado en el web.config, añadidos este a la Global.asax:

protected void Application_Start(object sender, EventArgs e) 
{ 
    RouteCollection routes = RouteTable.Routes; 

    routes.Add(
     "WebService", 
     new Route("service/{*Action}", new WebServiceRouteHandler()) 
    ); 
} 

.. .created esta clase:

public class WebServiceRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     // What now? 
    } 
} 

... y el problema está ahí, no sé qué hacer. Los tutoriales y guías que he leído usan enrutamiento para páginas, no para servicios web. ¿Esto es posible?

Sal: El controlador de ruta está trabajando, puedo visitar /servicio/ y se tira el NotImplementedException Salí en el método GetHttpHandler.

Respuesta

8

Solo pensé en redondear esta pregunta con un poco más de una solución detallada basada en la respuesta dada por Markives que funcionó para mí.

En primer lugar, aquí está la clase de manejador de ruta que toma el directorio virtual de su WebService como su parámetro de constructor.

public class WebServiceRouteHandler : IRouteHandler 
{ 
    private string _VirtualPath; 

    public WebServiceRouteHandler(string virtualPath) 
    { 
     _VirtualPath = virtualPath; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new WebServiceHandlerFactory().GetHandler(HttpContext.Current, 
      "*", 
      _VirtualPath, 
      HttpContext.Current.Server.MapPath(_VirtualPath)); 
    } 
} 

y el uso real de esta clase en el poco routey de Global.asax

routes.Add("SOAP", 
    new Route("soap", new WebServiceRouteHandler("~/Services/SoapQuery.asmx"))); 
+0

malvados. funciona perfectamente. gracias. – b0x0rz

+0

¡Me salvó el día! ¡Gracias! –

+2

¿Alguna idea sobre cómo mapear los métodos también? Entonces, en lugar de /Services/SoapQuery.asmx/HelloWorld, quiero que la ruta sea/Services/SoapQuery/HelloWorld –

2

Esto es para cualquier otra persona que quiera hacer lo anterior. Me pareció increíblemente difícil encontrar la información.

En el método GetHttpHandler(byVal requestContext as RequestContext) as IHttpHandler Implements IRouteHandler.GetHttpHandler (mi versión de los anteriores)

Esto es para Webforms 3,5 por cierto (el mío es en VB).

No puede utilizar el método habitual BuildManager.CreateInstanceFromVirtualPath() para invocar su servidor web que es solo para cosas que implementan iHttpHandler que .asmx no. En cambio es necesario:

Return New WebServiceHandlerFactory().GetHandler(
    HttpContext.Current, "*", "/VirtualPathTo/myWebService.asmx",  
    HttpContext.Current.Server.MapPath("/VirtualPathTo/MyWebService.aspx")) 

La documentación de MSDN dice que la tercera parámetro debe ser el RawURL, pasando HttpContext.Current.Request.RawURL no funciona, pero pasando la ruta de acceso virtual al archivo .asmx en lugar de obras estupendo.

Utilizo esta funcionalidad para que cualquier sitio web configurado de cualquier manera (incluso un directorio virtual) que llame (en IIS) a mi aplicación pueda llamar al servicio web de la aplicación usando algo como "http://url/virtualdirectory/anythingelse/WebService" y el el enrutamiento siempre lo enrutará a mi archivo .asmx.

Cuestiones relacionadas