web-dev-qa-db-fra.com

Comment obtenir le chemin de travail d'une application wcf?

Je veux obtenir le dossier de travail d'une application WCF. Comment puis-je l'avoir?

Si j'essaye

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

J'obtiens une exception de référence nulle (l'objet Http.Current est nul).


Ce que je voulais dire avec le dossier de travail était le dossier où mon service WCF est exécuté. Si je mets aspNetCompatibilityEnabled="true", J'obtiens cette erreur:

Le serveur n'a pas fourni de réponse significative; cela peut être dû à une incompatibilité de contrat, à un arrêt prématuré de la session ou à une erreur interne du serveur.

68
Stefan Filip

J'avais besoin des mêmes informations pour mon application WCF hébergée IIS6 et j'ai trouvé que cela fonctionnait pour moi:

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

Comme toujours, YMMV.

170
Donald Byrd

Veuillez voir la réponse de ongle ci-dessous. C'est beaucoup mieux que celui-ci.

Mis à jour après plus d'informations

Ce qui suit a fonctionné pour moi. Je l'ai testé avec un nouveau service WCF que j'ai hébergé sur IIS via un Service1.svc.

  1. Ajoutez <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> À la configuration Web. <system.serviceModel>..</ ..> Existait déjà.
  2. Ajoutez AspNetCompatibilityRequirementsAttribute au service avec le mode autorisé.
  3. Utilisez HttpContext.Current.Server.MapPath("."); pour obtenir le répertoire racine.

Vous trouverez ci-dessous le code complet de la classe de service. Je n'ai apporté aucune modification à l'interface IService1.

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

Et ci-dessous est un extrait du web.config.

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

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

Ancienne réponse

Que voulez-vous dire par le dossier de travail? Les services WCF peuvent être hébergés de différentes manières et avec différents points de terminaison, de sorte que le dossier de travail est légèrement ambigu.

Vous pouvez récupérer le "dossier de travail" normal en appelant Directory.GetCurrentDirectory () .

HttpContext est un objet ASP.Net. Même si WCF peut être hébergé sur IIS, ce n'est toujours pas ASP.Net et pour cette raison, la plupart des techniques ASP.Net ne fonctionnent pas par défaut. OperationContext est l'équivalent WCF de HttpContext. OperationContext contient des informations sur la demande entrante, la réponse sortante entre autres.

Bien que le moyen le plus simple soit d'exécuter le service en mode de compatibilité ASP.Net en le basculant dans le web.config. Cela devrait vous donner accès à ASP.Net HttpContext. Cela vous limitera aux * HttpBindings et IIS hébergement cependant. Pour basculer le mode de compatibilité, ajoutez ce qui suit au web.config.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
31
Mikko Rantanen

Selon ce que vous voulez. Je veux généralement résoudre une URL comme "~/dossier/fichier". Voilà ce qui a fonctionné.

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

Plus général, j'utilise celui-ci

AppDomain.CurrentDomain.BaseDirectory
18
Khoa Nguyen

L'aspNetCompatibilityEnabled = "true" aurait dû résoudre mon problème, mais j'ai eu cette erreur:

Le serveur n'a pas fourni de réponse significative; cela peut être dû à une incompatibilité de contrat, à un arrêt prématuré de la session ou à une erreur interne du serveur.

J'ai résolu mon problème d'obtention du chemin physique de mon service WCF en cours d'exécution en le récupérant à partir de mon domaine d'application actuel:

AppDomain.CurrentDomain.BaseDirectory
12
Stefan Filip

Pour référencer des fonctionnalités ASP.NET comme l'objet HttpContext, vous devez exécuter votre application WCF en mode de compatibilité ASP.NET. Cette article explique comment procéder.

3
pmarflee

Utilisez HostingEnvironment.ApplicationPhysicalPath dans WCF pour trouver le chemin physique de votre application. Utilisez l'espace de noms à l'aide de System.Web.Hosting;

2
Majid Khan