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.
wcf
path
httpcontext
Stefan Filip
quelle
quelle
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.
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
zu Web - Config.<system.serviceModel>..</ ..>
existierte bereits.AspNetCompatibilityRequirementsAttribute
den Dienst mit Modus erlaubt.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>
quelle
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");
quelle
Allgemeiner benutze ich diesen
AppDomain.CurrentDomain.BaseDirectory
quelle
AspNetCompatibilityEnabled = "true" hätte mein Problem lösen sollen, aber ich habe diesen Fehler erhalten:
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
quelle
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.
quelle
Verwenden Sie HostingEnvironment.ApplicationPhysicalPath in WCF, um den physischen Pfad Ihrer Anwendung zu ermitteln. Verwenden Sie den Namespace mit System.Web.Hosting.
quelle