68 votes

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'obtenir ?

Si j'essaie

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 de WCF fonctionne. Si je place aspNetCompatibilityEnabled="true" j'obtiens cette erreur :

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

173voto

ongle Points 4567

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

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

Comme toujours, YMMV.

2 votes

Cette solution est celle qui a le mieux fonctionné pour moi. Je vous recommande de l'utiliser plutôt que de devoir modifier toutes sortes d'autres paramètres...

0 votes

Je n'ai pas de System.Web.Hosting, je ne sais vraiment pas pourquoi .

0 votes

Merci ongle :) J'ai réussi à utiliser AppDomain :)

31voto

Mikko Rantanen Points 4343

Veuillez consulter la réponse d'ongle ci-dessous. Elle est bien meilleure que celle-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. Ajouter <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> à la configuration web. <system.serviceModel>..</ ..> existait déjà.
  2. Ajouter AspNetCompatibilityRequirementsAttribute au service avec le mode autorisé.
  3. Utilice 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 fait aucun changement dans l'interface IService1.

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

Et ci-dessous, 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

Qu'entendez-vous par Dossier de travail ? Les services WCF peuvent être hébergés de plusieurs façons différentes et avec différents points de terminaison, donc le dossier de travail est légèrement ambigu.

Vous pouvez récupérer le "dossier de travail" normal avec un appel à Répertoire.GetCurrentDirectory() .

HttpContext est un objet d'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 de HttpContext de WCF. L'OperationContext contient des informations sur la demande entrante, la réponse sortante entre autres choses.

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

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

0 votes

Ce que je voulais dire avec le "Working folder" était le chemin physique où mon service WCF était exécuté. J'ai un fichier xml là et je veux le lire. Directory.GetCurrentDirectory() ne fonctionne pas, et quand j'essaie le paramètre que vous avez dit à propos du mode de compatibilité, j'obtiens cette erreur : Le serveur n'a pas fourni de réponse significative ; cela peut être causé par une inadéquation du contrat, un arrêt prématuré de la session ou une erreur interne du serveur.

9 votes

Utiliser ceci qui fonctionne aussi bien avec le contexte ASPNET ou sans System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file") ;

0 votes

L'AspNetCompatibilityMode ne fonctionnera pas si vous devez accéder à HttpContext.Current dans une méthode qui est appelée via le multithreading.

20voto

Osa Points 141

En fonction de ce que vous voulez. Je veux généralement résoudre une url comme "~/folder/file". Voici ce qui a fonctionné.

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

19voto

Kane Nguyen Points 133

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

AppDomain.CurrentDomain.BaseDirectory

0 votes

+un pour une solution sans System.Web

12voto

Stefan Filip Points 765

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

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

J'ai résolu mon problème en obtenant le chemin physique de mon service WCF en cours d'exécution en l'obtenant de mon domaine d'application actuel :

AppDomain.CurrentDomain.BaseDirectory

1 votes

Si vous exécutez ServiceHost manuellement, seul AppDomain.CurrentDomain.BaseDirectory pointe vers la source correcte. Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X