Come ottenere il percorso di lavoro di un’applicazione wcf?

Voglio ottenere la cartella di lavoro di un’applicazione WCF. Come posso averlo?

Se ci provo

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath) 

Ricevo un’eccezione di riferimento null (l’object Http.Current è null).


Quello che intendevo con la cartella di lavoro era la cartella in cui è in esecuzione il mio servizio WCF. Se imposto aspNetCompatibilityEnabled="true" , ottengo questo errore:

Il server non ha fornito una risposta significativa; questo potrebbe essere causato da una mancata corrispondenza del contratto, uno spegnimento prematuro della sessione o un errore interno del server.

Avevo bisogno delle stesse informazioni per la mia applicazione WCF ospitata su IIS6 e ho scoperto che questo funzionava per me:

 string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 

Come sempre, YMMV.

Per favore vedi la risposta di ongle qui sotto. È molto meglio di questo.

Aggiornato dopo ulteriori informazioni

Il seguente ha funzionato per me. L’ho provato con un nuovo servizio WCF che ho ospitato su IIS attraverso un Service1.svc.

  1. Aggiungi alla configurazione web. .. esisteva già.
  2. Aggiungi AspNetCompatibilityRequirementsAttribute al servizio con la modalità consentita.
  3. Utilizzare HttpContext.Current.Server.MapPath("."); per ottenere la directory radice.

Di seguito è riportato il codice completo per la class di servizio. Non ho apportato modifiche all’interfaccia IService1.

 [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] public class Service1 : IService1 { public void DoWork() { HttpContext.Current.Server.MapPath("."); } } 

E sotto c’è un estratto da web.config.

            

Vecchia risposta

Cosa intendi per cartella di lavoro? I servizi WCF possono essere ospitati in diversi modi e con endpoint diversi, pertanto la cartella di lavoro è leggermente ambigua.

È ansible recuperare la normale “cartella di lavoro” con una chiamata a Directory.GetCurrentDirectory () .

HttpContext è un object ASP.Net. Anche se WCF può essere ospitato su IIS, non è ancora ASP.Net e per questo motivo la maggior parte delle tecniche ASP.Net non funziona per impostazione predefinita. OperationContext è l’equivalente di HttpContext della WCF. OperationContext contiene informazioni sulla richiesta in entrata, risposta in uscita tra le altre cose.

Anche se il modo più semplice potrebbe essere quello di eseguire il servizio in modalità di compatibilità ASP.Net triggersndolo in web.config. Questo dovrebbe darti accesso a HttpContext di ASP.Net. Ti limiterà comunque al * HttpBindings e all’hosting di IIS. Per triggersre la modalità di compatibilità, aggiungi quanto segue al web.config.

    

A seconda di cosa vuoi. Solitamente voglio risolvere un url come “~ / folder / file”. Questo è ciò che ha funzionato.

 System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file"); 

Più generale, sto usando questo

 AppDomain.CurrentDomain.BaseDirectory 

L’aspNetCompatibilityEnabled = “true” avrebbe dovuto risolvere il mio problema, ma ho ricevuto questo errore:

Il server non ha fornito una risposta significativa; questo potrebbe essere causato da una mancata corrispondenza del contratto, uno spegnimento prematuro della sessione o un errore interno del server.

Ho risolto il mio problema con l’ottenimento del percorso fisico del mio servizio WCF in esecuzione scaricandolo dal mio dominio dell’app corrente:

 AppDomain.CurrentDomain.BaseDirectory 

Per fare riferimento a funzionalità ASP.NET come l’object HttpContext, è necessario eseguire l’app WCF nella modalità di compatibilità ASP.NET. Questo articolo spiega come farlo.

Utilizzare HostingEnvironment.ApplicationPhysicalPath in WCF per trovare il percorso fisico dell’applicazione. Usa lo spazio dei nomi usando System.Web.Hosting;