Question

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

Si j'essaie

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

j'obtenir une exception de référence null (l'objet Http.Current est nulle).


Ce que je voulais dire avec le dossier de travail était le dossier dans lequel mon service WCF est en cours d'exécution. Si je mets aspNetCompatibilityEnabled="true", je reçois cette erreur:

  

Le serveur n'a pas fourni une réponse significative; cela pourrait être causé par un décalage de contrat, un arrêt de la session prématurée ou une erreur de serveur interne.

Était-ce utile?

La solution

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.

Autres conseils

S'il vous plaît voir réponse ci-dessous de ongle. Il est beaucoup mieux que celui-ci.

Mise à jour après plus d'informations

Les personnes suivantes ont travaillé pour moi. Je l'ai testé avec un nouveau service WCF je hébergé sur IIS par un Service1.svc.

  1. Ajoutez à <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> config web. <system.serviceModel>..</ ..> existait déjà.
  2. Ajouter AspNetCompatibilityRequirementsAttribute au service avec le mode admis.
  3. Utilisez HttpContext.Current.Server.MapPath("."); pour obtenir le répertoire racine.

est ci-dessous le code complet pour la classe de service. J'ai fait aucun changement dans l'interface IService1.

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

Voici 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 plusieurs façons différentes et avec différents critères d'évaluation afin dossier de travail est un peu ambigu.

Vous pouvez récupérer la normale "Dossier de travail" avec un appel à Directory.GetCurrentDirectory () .

HttpContext est un objet ASP.Net. Même si WCF peut être hébergé sur IIS, il 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 du Fonds de roulement de HttpContext. Le OperationContext contient des informations sur la requête entrante, réponse sortante entre autres.

Bien que la façon la plus simple est d'exécuter le service ASP mode de compatibilité .Net en activant dans le web.config. Cela devrait vous donner accès au ASP.Net HttpContext. Il vous limiter au * HttpBindings et IIS d'hébergement bien. Pour activer ou désactiver le mode de compatibilité, ajoutez ce qui suit à la web.config.

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

En fonction de ce que vous voulez. Je veux habituellement résoudre une URL comme « ~ / dossier / fichier ». C'est ce qui a fonctionné.

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

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

AppDomain.CurrentDomain.BaseDirectory

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

  

Le serveur n'a pas fourni une réponse significative; cela pourrait être causé par un décalage de contrat, un arrêt de la session prématurée ou une erreur de serveur interne.

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

AppDomain.CurrentDomain.BaseDirectory

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. Cette explique comment faire.

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

scroll top