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.

Stefan Filip
quelle

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.

Donald Byrd
quelle
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>
Mikko Rantanen
quelle
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");
Osa
quelle
18

Allgemeiner benutze ich diesen

AppDomain.CurrentDomain.BaseDirectory
Khoa Nguyen
quelle
+ 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
Stefan Filip
quelle
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.

pmarflee
quelle
2

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

Majid Khan
quelle