Frage

Ich mag den Arbeitsordner einer WCF-Anwendung bekommen. Wie kann ich es bekommen?

Wenn ich versuche,

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

ich eine null-Verweisausnahme erhalten (das Http.Current Objekt ist null).


Was ich mit dem Arbeitsordner gemeint war der Ordner, in dem mein WCF-Dienst ausgeführt wird. Wenn ich aspNetCompatibilityEnabled="true" gesetzt, bekomme ich diesen Fehler:

  

Der Server eine sinnvolle Antwort nicht vorsah; dies könnte durch einen Vertrag Mismatch, eine vorzeitige Sitzung Herunterfahren oder einen internen Server-Fehler verursacht werden.

War es hilfreich?

Lösung

brauchte ich die gleichen Informationen für meine IIS6 WCF-Anwendung gehostet und ich fand, dass dies für mich gearbeitet:

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

Wie immer YMMV.

Andere Tipps

Bitte sehen ongle die unten Antwort. Es ist viel besser als diese.

Aktualisiert nach mehr Informationen

Die folgenden für mich gearbeitet. Getestet habe ich es mit einem neuen WCF-Dienst ich auf IIS durch eine Service1.svc gehostet werden.

  1. Fügen Sie <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> zu Web-Config. <system.serviceModel>..</ ..> gab es schon.
  2. Fügen Sie AspNetCompatibilityRequirementsAttribute zum Dienst mit Modus erlaubt.
  3. Verwenden Sie HttpContext.Current.Server.MapPath(".");, um das Root-Verzeichnis.

Im Folgenden ist der vollständige Code für die Serviceklasse. Ich habe keine Änderungen in der IService1 Schnittstelle.

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

Und unten ist ein Auszug aus der web.config.

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

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

Alt Antwort

Was meinst du mit dem Arbeitsordner? WCF-Dienste können auf verschiedene Weise und mit unterschiedlichen Endpunkten gehostet werden, um Ordner arbeiten, ist etwas zweideutig.

Sie können den normalen "Arbeitsordner" mit einem Aufruf von Directory.GetCurrentDirectory () .

Httpcontext ist ein ASP.Net-Objekt. Auch wenn kann WCF auf IIS gehostet werden, ist es noch nicht ASP.Net und aus diesem Grund die meisten der ASP.Net-Techniken funktionieren nicht standardmäßig aktiviert. Operation ist das Äquivalent des WCF von Httpcontext. Die Operation enthält Informationen über die eingehende Anfrage, ausgehende Antwort unter anderem.

Obwohl der einfachste Weg könnte sein, den Service in ASP läuft .Net-Kompatibilitätsmodus von Makeln in der web.config . Dies sollten Sie auf die ASP.Net Httpcontext zugreifen. Es wird Sie auf die * HttpBindings begrenzen und obwohl IIS-Hosting. Um den Kompatibilitätsmodus zu wechseln, fügen Sie folgendes in die web.config.

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

Je nachdem, was Sie wollen. Ich möchte in der Regel eine URL wie „~ / Ordner / Datei“ lösen. Dies ist, was funktioniert hat.

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

Weitere allgemeine, ich bin mit diesem ein

AppDomain.CurrentDomain.BaseDirectory

Die aspNetCompatibilityEnabled = "true" sollte mein Problem gelöst hat, aber ich habe diesen Fehler:

  

Der Server eine sinnvolle Antwort nicht vorsah; dies könnte durch einen Vertrag Mismatch, eine vorzeitige Sitzung Herunterfahren oder einen internen Server-Fehler verursacht werden.

beschloß ich, mein Problem mit dem physischen Pfad meines laufenden WCF-Dienstes bekommen, indem sie es aus meiner aktuellen Anwendungsdomäne bekommen:

AppDomain.CurrentDomain.BaseDirectory

Um ASP.NET-Funktionen wie das Httpcontext-Objekt zu verweisen, müssen Sie Ihre WCF-Anwendung in ASP.NET-Kompatibilitätsmodus ausgeführt werden. Diese Artikel rel="nofollow erklärt, wie dies zu tun.

Verwenden HostingEnvironment.ApplicationPhysicalPath in WCF Anwendung physischen Pfad zu finden. Verwenden Sie Namespace mit System.Web.Hosting;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top