Domanda

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

Se provo

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

Ho un riferimento null eccezione (l'Http.Oggetto corrente è null).


Quello che volevo dire con la cartella di lavoro è la cartella in cui il mio servizio WCF è in esecuzione.Se ho impostato aspNetCompatibilityEnabled="true", Ottengo questo errore:

Il server non ha fornito una significativa risposta;questo potrebbe essere causato da una mancata corrispondenza del contratto, una prematura sessione di arresto o di un errore interno del server.

È stato utile?

Soluzione

mi serviva 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.

Altri suggerimenti

Si prega di vedere ongle la risposta qui sotto.È molto meglio di questo.

Aggiornato dopo ulteriori informazioni

I seguenti lavorato per me.Ho provato con un nuovo Servizio WCF che ho ospitato su IIS attraverso un Service1.svc.

  1. Aggiungere <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> web config. <system.serviceModel>..</ ..> esisteva già.
  2. Aggiungere AspNetCompatibilityRequirementsAttribute il servizio con le Modalità Consentite.
  3. Utilizzare HttpContext.Current.Server.MapPath("."); per ottenere il root directory.

Di seguito è il codice completo per la classe di servizio.Ho fatto alcuna modifica alla IService1 interfaccia.

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

E di seguito un estratto dal web.config.

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

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

Vecchia risposta

Che cosa si intende per la Cartella di Lavoro?Servizi WCF può essere ospitato in diversi modi e con diversi computer in modo cartella di lavoro è un po ' ambigua.

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

HttpContext è un ASP.Net oggetto.Anche se WCF può essere ospitato su IIS, ancora non ASP.Net e per questo motivo la maggior parte delle ASP.Net le tecniche non funzionano per impostazione predefinita.OperationContext è WCF equivalente di HttpContext.Il OperationContext contiene informazioni su richiesta in ingresso, in uscita risposta tra le altre cose.

Anche se il modo più semplice potrebbe essere quella di eseguire il servizio in ASP.Net modalità di compatibilità attivando nel web.config.Questo dovrebbe dare l'accesso al ASP.Net HttpContext.Per limitare la *HttpBindings e hosting di IIS però.Per attivare la modalità di compatibilità, aggiungere il seguente per il web.config.

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

A seconda di ciò che si desidera. Io di solito voglio risolvere un URL del tipo "/ cartella ~ / file". Questo è ciò che ha funzionato.

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

Più in generale, io sto usando questo uno

AppDomain.CurrentDomain.BaseDirectory

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

  

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

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

AppDomain.CurrentDomain.BaseDirectory

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 spiega come fare questo.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top