2009-04-26 2 views
66

Voglio ottenere la cartella di lavoro di un'applicazione WCF. Come posso averlo?Come ottenere il percorso di lavoro di un'applicazione wcf?

Se provo

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

ottengo un'eccezione riferimento nullo (l'oggetto Http.Current è nullo).


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

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

risposta

164

avevo bisogno le stesse informazioni per la mia IIS6 ospitato un'applicazione WCF e ho trovato che questo ha funzionato per me:

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

Come sempre, YMMV.

+2

Questa soluzione ha funzionato meglio per me: ti consiglio di utilizzarla piuttosto che dover apportare modifiche di qualsiasi tipo ad altre impostazioni ... –

+0

Non ho System.Web.Hosting, davvero non ne conosco il motivo. . . – nXqd

+1

@nXqd È in System.Web.dll tornare al framework 2.0 – ongle

3

Al fine di fare riferimento a ASP.NET presenta come l'oggetto HttpContext, è necessario eseguire la vostra applicazione WCF in modalità di compatibilità ASP.NET. Questo article spiega come farlo.

31

Vedere la risposta di ongle qui sotto. È molto meglio di questo.

aggiornato dopo ulteriori informazioni

Di seguito ha lavorato per me. L'ho provato con un nuovo servizio WCF che ho ospitato su IIS attraverso un Service1.svc.

  1. Aggiungi <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> alla configurazione Web. <system.serviceModel>..</ ..> esisteva già.
  2. Aggiungi AspNetCompatibilityRequirementsAttribute al servizio con Modalità consentita.
  3. Utilizzare HttpContext.Current.Server.MapPath("."); per ottenere la directory principale.

Di seguito è riportato il codice completo per la classe 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 di seguito è un estratto da web.config.

<system.serviceModel> 
    <!-- Added only the one line below --> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 

    <!-- Everything else was left intact --> 
    <behaviors> 
     <!-- ... --> 
    </behaviors> 
    <services> 
     <!-- ... --> 
    </services> 
</system.serviceModel> 

Vecchio risposta

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

È possibile recuperare la normale "cartella di lavoro" con una chiamata a Directory.GetCurrentDirectory().

HttpContext è un oggetto 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 ASP.Net compatibility mode spostandolo in web.config. Questo dovrebbe darti accesso a HttpContext di ASP.Net. Ti limiterà comunque al * HttpBindings e all'hosting di IIS. Per attivare la modalità di compatibilità, aggiungi quanto segue al web.config.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
</system.serviceModel> 
+0

Quello che volevo dire con la "Cartella di lavoro" è stato il percorso fisico in cui il mio servizio WCF era in esecuzione. Ho un file xml lì e voglio leggerlo. Directory.GetCurrentDirectory() non funziona, e quando provo l'impostazione che hai detto sulla modalità di compatibilità 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. –

+0

Risposta aggiornata con codice di esempio testato. –

+9

usa ciò che funziona sia con il contesto ASPNET che senza System.Web.Hosting.HostingEnvironment.MapPath ("~/folder/file"); –

12

L'aspNetCompatibilityEnabled = "true" avrebbe dovuto risolvere il mio problema, ma ho ottenuto questo errore:

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

Ho risolto il mio problema con ottenere il percorso fisico del mio servizio WCF in esecuzione da ottenere da il mio attuale dominio app:

AppDomain.CurrentDomain.BaseDirectory 
+1

Se si esegue ServiceHost manualmente, solo AppDomain.CurrentDomain.BaseDirectory punta alla fonte corretta. Thx man! – mastak

20

A seconda di ciò che si desidera. Solitamente voglio risolvere un url come "~/folder/file". Questo è ciò che ha funzionato.

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

La migliore risposta! grazie –

2

Usa HostingEnvironment.ApplicationPhysicalPath in WCF per trovare l'applicazione percorso fisico. Usa lo spazio dei nomi usando System.Web.Hosting;

15

Più in generale, io sto usando questo

AppDomain.CurrentDomain.BaseDirectory 
+0

+ uno per una soluzione senza System.Web – Filip