Wie erhalte ich den Arbeitspfad einer wcf-Anwendung?


69

Ich möchte den Arbeitsordner einer WCF-Anwendung erhalten. Wie kann ich es bekommen?

Wenn ich es versuche

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

Ich erhalte eine Nullreferenzausnahme (das Http.Current-Objekt ist null).


Was ich mit dem Arbeitsordner meinte, war der Ordner, in dem mein WCF-Dienst ausgeführt wird. Wenn ich einstelle aspNetCompatibilityEnabled="true", erhalte ich folgende Fehlermeldung:

Der Server hat keine aussagekräftige Antwort gegeben. Dies kann durch eine Vertragsinkongruenz, ein vorzeitiges Herunterfahren der Sitzung oder einen internen Serverfehler verursacht werden.

Antworten:


173

Ich brauchte die gleichen Informationen für meine von IIS6 gehostete WCF-Anwendung und stellte fest, dass dies für mich funktioniert:

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

Wie immer YMMV.


2
Diese Lösung hat am besten für mich funktioniert - ich würde empfehlen, sie zu verwenden, anstatt alle möglichen anderen Einstellungsänderungen vornehmen zu müssen ...
Sam Schutte

Ich habe kein System.Web.Hosting, ich weiß wirklich nicht warum. . .
Dzung Nguyen

Danke ongle :) Ich bin erfolgreich mit AppDomain :)
Dzung Nguyen

2
@nXqd: Sie müssen sicherstellen, dass Sie nicht die Client-Profilversion des ausgewählten Frameworks haben.
Roger Lipscombe

Diese Antwort hat mir gerade den Tag gerettet. Bitte machen Sie es zum akzeptierten, da die Verwendung von ASP.NET-Kompatibilität nicht immer bevorzugt wird. Dieser funktioniert unabhängig davon, ob die ASP.NET-Kompatibilität aktiviert oder deaktiviert ist.
Roy

31

Bitte sehen Sie die Antwort von ongle unten. Es ist viel besser als dieses.

Nach weiteren Informationen aktualisiert

Folgendes hat bei mir funktioniert. Ich habe es mit einem neuen WCF-Dienst getestet, den ich über einen Service1.svc auf IIS gehostet habe.

  1. In <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>zu Web - Config. <system.serviceModel>..</ ..>existierte bereits.
  2. In AspNetCompatibilityRequirementsAttributeden Dienst mit Modus erlaubt.
  3. Verwenden Sie HttpContext.Current.Server.MapPath(".");diese Option , um das Stammverzeichnis abzurufen.

Unten finden Sie den vollständigen Code für die Serviceklasse. Ich habe keine Änderungen an der IService1-Schnittstelle vorgenommen.

[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>

Alte Antwort

Was meinst du mit dem Arbeitsordner? WCF-Dienste können auf verschiedene Arten und mit unterschiedlichen Endpunkten gehostet werden, sodass der Arbeitsordner etwas mehrdeutig ist.

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

HttpContext ist ein ASP.Net-Objekt. Selbst wenn WCF auf IIS gehostet werden kann, ist es immer noch nicht ASP.Net. Aus diesem Grund funktionieren die meisten ASP.Net-Techniken nicht standardmäßig. OperationContext ist das WCF-Äquivalent zu HttpContext. Der OperationContext enthält unter anderem Informationen zur eingehenden Anfrage und zur ausgehenden Antwort.

Am einfachsten ist es jedoch, den Dienst im ASP.Net-Kompatibilitätsmodus auszuführen, indem Sie ihn in der Datei web.config umschalten. Dies sollte Ihnen Zugriff auf den ASP.Net HttpContext geben. Es wird Sie jedoch auf das * HttpBindings- und IIS-Hosting beschränken. Fügen Sie der web.config Folgendes hinzu, um den Kompatibilitätsmodus umzuschalten.

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

Was ich mit dem "Arbeitsordner" meinte, war der physische Pfad, auf dem mein WCF-Dienst ausgeführt wurde. Ich habe dort eine XML-Datei und möchte sie lesen. Directory.GetCurrentDirectory () funktioniert nicht. Wenn ich die Einstellung versuche, die Sie zum Kompatibilitätsmodus angegeben haben, wird folgende Fehlermeldung angezeigt: Der Server hat keine aussagekräftige Antwort gegeben. Dies kann durch eine Vertragsinkongruenz, ein vorzeitiges Herunterfahren der Sitzung oder einen internen Serverfehler verursacht werden.
Stefan Filip

9
Verwenden Sie diese Option, die sowohl mit dem ASPNET-Kontext als auch ohne System.Web.Hosting.HostingEnvironment.MapPath ("~ / folder / file") funktioniert.
Simon_Weaver

Der AspNetCompatibilityMode funktioniert nicht, wenn Sie in einer Methode, die über Multithreading aufgerufen wird, auf HttpContext.Current zugreifen müssen.
Anchit

20

Je nachdem was du willst. Normalerweise möchte ich eine URL wie "~ / folder / file" auflösen. Das hat funktioniert.

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

18

Allgemeiner benutze ich diesen

AppDomain.CurrentDomain.BaseDirectory

+ eins für eine Lösung ohne System.Web
Filip

12

AspNetCompatibilityEnabled = "true" hätte mein Problem lösen sollen, aber ich habe diesen Fehler erhalten:

Der Server hat keine aussagekräftige Antwort gegeben. Dies kann durch eine Vertragsinkongruenz, ein vorzeitiges Herunterfahren der Sitzung oder einen internen Serverfehler verursacht werden.

Ich habe mein Problem mit dem Abrufen des physischen Pfads meines laufenden WCF-Dienstes behoben, indem ich ihn von meiner aktuellen App-Domäne abgerufen habe:

AppDomain.CurrentDomain.BaseDirectory

1
Wenn Sie ServiceHost manuell ausführen, zeigt nur AppDomain.CurrentDomain.BaseDirectory auf die richtige Quelle. Danke !
Mastak

3

Um auf ASP.NET-Funktionen wie das HttpContext-Objekt zu verweisen, müssen Sie Ihre WCF-App im ASP.NET-Kompatibilitätsmodus ausführen. Dieser Artikel erklärt, wie das geht.


2

Verwenden Sie HostingEnvironment.ApplicationPhysicalPath in WCF, um den physischen Pfad Ihrer Anwendung zu ermitteln. Verwenden Sie den Namespace mit System.Web.Hosting.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.