2009-04-26 7 views
66

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

Si je tente

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

Je reçois une exception de référence null (l'objet est Http.Current null). Ce que je voulais dire par le dossier de travail était le dossier où mon service WCF est en cours d'exécution. Si je mets aspNetCompatibilityEnabled="true", je reçois cette erreur:

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.

Répondre

164

Je avais besoin les mêmes informations pour mon IIS6 a accueilli l'application WCF et je trouve que cela a fonctionné pour moi:

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

Comme toujours, YMMV.

+2

Cette solution fonctionnait mieux pour moi - je recommanderais de l'utiliser plutôt que d'avoir à faire toutes sortes d'autres changements de paramètres ... –

+0

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

+1

@nXqd C'est dans System.Web.dll qui revient au framework 2.0 – ongle

3

Pour référencer ASP.NET fonctionnalités telles que l'objet HttpContext, vous devez exécuter votre application WCF en mode de compatibilité ASP.NET. Ce article explique comment faire cela.

31

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

jour après plus d'informations

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

  1. Ajouter <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 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 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> 

Vieille 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 des points de terminaison différents, de sorte que le dossier de travail est légèrement ambigu.

Vous pouvez récupérer le "Dossier de travail" normal en appelant le 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 de HttpContext de la WCF. Le 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 au ASP.Net compatibility mode en le basculant dans le fichier web.config. Cela devrait vous donner accès au HttpContext ASP.Net. Cela vous limitera au * HttpBindings et à l'hébergement IIS. Pour basculer le mode de compatibilité, ajoutez ce qui suit au fichier web.config.

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

Ce que je voulais dire avec le « dossier de travail » était le chemin physique où mon service WCF est en cours d'exécution. J'ai un fichier XML là et je veux le lire. Directory.GetCurrentDirectory() ne fonctionne pas et lorsque j'essaie le paramètre que vous avez indiqué à propos du mode de compatibilité, j'obtiens cette erreur: Le serveur n'a pas fourni de réponse significative; Cela peut être dû à une incompatibilité de contrat, à une fermeture de session prématurée ou à une erreur interne du serveur. –

+0

Réponse mise à jour avec un exemple de code testé. –

+9

utilise ceci qui fonctionne avec le contexte ASPNET ou sans System.Web.Hosting.HostingEnvironment.MapPath ("~/dossier/fichier"); –

12

Le aspNetCompatibilityEnabled = « true » aurait dû résoudre mon problème, mais je suis arrivé cette erreur:

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.

Je résolus mon problème à obtenir le chemin physique de mon service WCF en cours d'exécution en l'obtenant mon domaine actuel de l'application:

AppDomain.CurrentDomain.BaseDirectory 
+1

Si vous exécutez ServiceHost manuellement, seuls les points AppDomain.CurrentDomain.BaseDirectory corrigent la source. Thx homme! – mastak

20

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

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

Meilleure réponse! merci –

2

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

15

Plus général, je suis en utilisant celui-ci

AppDomain.CurrentDomain.BaseDirectory 
+0

+ un pour une solution sans System.Web – Filip

Questions connexes