2010-04-08 14 views
7

Stavo cercando un modo per instradare http://www.example.com/WebService.asmx a http://www.example.com/service/ utilizzando solo il framework di routing ASP.NET 3.5 senza la necessità di configurare il server IIS.Asp.Net 3.5 Routing su Webservice?

Fino ad ora ho fatto quello che la maggior parte dei tutorial mi ha detto, ha aggiunto un riferimento all'assembly di routing, roba configurato nel web.config, aggiunte questo al Global.asax:

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

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

.. .created questa classe:

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

... e il problema è proprio lì, non so cosa fare. Le esercitazioni e le guide che ho letto utilizzano il routing per le pagine, non i servizi web. È possibile?

Ps: Il gestore percorso sta lavorando, posso visitare /servizio/ e getta la NotImplementedException ho lasciato in metodo di GetHttpHandler.

risposta

8

Ho solo pensato di completare questa domanda con un po 'più di una soluzione dettagliata basata sulla risposta data da Markives che ha funzionato per me.

In primo luogo, ecco la classe del gestore di route che prende la directory virtuale sul proprio WebService come parametro costruttore.

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)); 
    } 
} 

e l'effettivo utilizzo di questa classe all'interno del bit routey di Global.asax

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

malvagio. funziona perfettamente grazie. – b0x0rz

+0

Salvato la mia giornata! Grazie! –

+2

Qualche idea su come mappare anche i metodi? Quindi, invece di /Services/SoapQuery.asmx/HelloWorld, voglio che il percorso sia/Services/SoapQuery/HelloWorld –

2

Questo è per chiunque altro voglia fare quanto sopra. Ho trovato incredibilmente difficile trovare le informazioni.

Nel GetHttpHandler(byVal requestContext as RequestContext) as IHttpHandler Implements IRouteHandler.GetHttpHandler metodo (la mia versione di quanto sopra)

Questo è per Webforms di 3,5 per la via (il mio è in VB).

Non è possibile utilizzare il solito metodo BuildManager.CreateInstanceFromVirtualPath() per richiamare il proprio servizio Web che è solo per le cose che implementano iHttpHandler quale .asmx non lo fa. Invece è necessario:

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

La documentazione MSDN dice che il terzo parametro deve essere il RawURL, passando HttpContext.Current.Request.RawURL non funziona, ma passando il percorso virtuale del file .asmx invece opere grande.

Io uso questa funzionalità in modo che il mio webservice possa essere chiamato da qualsiasi sito Web configurato in ogni caso (anche una directory virtuale) che punta (in IIS) alla mia applicazione può chiamare il servizio web dell'applicazione utilizzando qualcosa come "http://url/virtualdirectory/anythingelse/WebService" e il il routing indirizzerà sempre questo al mio file .asmx.

Problemi correlati