2010-07-20 11 views
12

Sto utilizzando WCF 4 su IIS 7.5 e voglio eliminare l'estensione .svc predefinita dall'URL di tutti i miei servizi RESTful. Ho visto gli approcci documentati usando l'Url Rewrite Module e un IHttpModule, ma non voglio prendere questi approcci.Eliminare il file .svc nell'URL di un servizio WCF 4 utilizzando Routes?

Ho vagamente familiarità con il concetto di Routes introdotto in ASP.NET MVC e, come ho capito, ora sono estratti da MVC in Net 4 come System.Web.Routing. Ma guardando i documenti sembra che ho bisogno di aggiungere un file Global.asax al mio progetto che non mi piace molto. C'è un altro modo per gestire questo?

Ho anche visto la funzione di attivazione basata sulla configurazione, ma sembra che solo eliminare il file .svc, ma richiede comunque che io usi .svc nell'URL del mio servizio.

Qualcuno può riassumere le mie opzioni qui per non aver bisogno di .svc nei miei URL?

risposta

9

Certo, nessun problema: prima di tutto, leggi tutto sulle nuove funzionalità di WCF 4 in A Developer's Introduction to Windows Communication Foundation 4.

Quello che stai cercando si chiama attivazione servizio senza file. Si tratta di una nuova impostazione nel vostro <system.serviceModel> che sembra qualcosa di simile:

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

In sostanza, tutte le informazioni che si avrebbe nel file .svc * (percorso, il servizio a chiamata) è in questa sezione config ora.

Si dovrebbe essere in grado di chiamare questo servizio in

http://yourserver/virtualdirectory/YourService 

ora - non più * .SVC, senza URL disordinato riscrittura ecc - che funziona solo pianura!

Aggiornamento: non sembra funzionare così bene, a meno che non entri e aggiunga un'estensione * .svc al tuo percorso relativo - il genere sconfigge l'intero scopo!

Se si desidera effettuare la registrazione utilizzando una route ASP.NET, consultare lo MSDN docs su tale argomento. Dovreste avere qualcosa di simile nella vostra domanda di avvio, in una web app che sarebbe 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))); 
} 

Speriamo, con questo, sarete in grado di ottenere il vostro servizio attivo e funzionante senza alcuna * Estensioni di file .svc!

+0

Sembra che tu stia parlando con configurazione basata su attivazione (http: // msdn .microsoft.com/it-it/library/ee358764.aspx) piuttosto che System.Web.Routing. Il problema è che sembra relativoAddress deve utilizzare un'estensione supportata WCF (come .svc). Non riesco a far funzionare il tuo esempio, ho appena ricevuto l'errore: "Il relativoAddress registrato" YourService "nella sezione" system.serviceModel/serviceHostingEnvironment/serviceActivations "nel file di configurazione non ha un'estensione" – BrettRobi

+0

@BrettRobi: divertente - che L'articolo MSDN si contraddice da solo ... e questo è contrario a tutte le presentazioni e i discorsi che ho visto/ascoltato finora sull'attivazione senza file ..... Ho comunque aggiornato la mia risposta –

+2

Sì, speravo che sarebbe fare il trucco ma sembra davvero un modo semplice per eliminare il file .svc stesso ma non la necessità di .svc nell'URL. Grazie per l'aiuto però ... – BrettRobi

5

Solo per concludere la risposta e aggiungere un altro punto lì. Avrete bisogno lo stesso di registrazione percorso ASP.NET come sopra:

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

Al fine di ottenere questo lavoro è necessario tuttavia aggiungere alcune altre cose da web.config. Il servizio di hosting deve essere configurato per essere compatibile con ASP.NET. Questo può essere fatto con l'aggiunta di aspNetCompatibiliyEnabled = "true" per elemento serviceHostingEnvironment:

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

Spero che questo chiarisce e dà un più facile trovare una soluzione.

+1

Vedere qui perché non utilizzare WebServiceHostFactory, utilizzare solo ServiceHostFactory http://stackoverflow.com/questions/2921802/serviceroute-webservicehostfactory-kills-wsdl-generazione-come-creare-extens –

+0

@LuizFelipe, la domanda a cui si fa riferimento è per un servizio SOAP, non per un servizio REST (WebHttp) Questa domanda è per un servizio REST WebServiceHostFactory In questo caso è corretto factory –

+0

Sì, cambiando per utilizzare ServiceHostFactory risolve il problema di routing, ma quindi ottieni un servizio SOAP, hai ragione. Mi sbagliavo, se la soluzione di cui sopra non funziona, basta usare il routing URL. –

1

Importante chiarimento per IIS 7.5 e Framework 4.0:

Per il modulo Web di routing per funzionare, richiede il pool di applicazioni impostato su "modalità integrata", non funziona in modalità "Classic"

Un ulteriore problema che ho trovato dopo la commutazione è che quando in "Modalità integrata" l'applicazione si arrestava in modo anomalo all'avvio perché avevo moduli inclusi nella sezione system.Web>.

ho riparato spostando i moduli al < system.webServer> sezione di configurazione che è nuovo per IIS 7

Problemi correlati