Jak uzyskać ścieżkę roboczą aplikacji wcf?

Chcę uzyskać folder roboczy aplikacji WCF. Jak mogę go zdobyć?

If I try

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

Otrzymuję wyjątek null reference (Http.Bieżący obiekt jest null).


Miałem na myśli folder roboczy, w którym działa moja usługa WCF. Jeśli ustawiam aspNetCompatibilityEnabled="true", dostaję ten błąd:

Serwer nie dostarczył znaczącej odpowiedzi; może to być spowodowane niedopasowaniem umowy, przedwczesnym zamknięciem sesji lub wewnętrznym serwerem błąd.
Author: BoltClock, 2009-04-26

7 answers

Potrzebowałem tych samych informacji dla mojej aplikacji IIS6 hosted WCF i stwierdziłem, że to działa dla mnie:

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

Jak zawsze, YMMV.

 166
Author: ongle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 21:49:42

Proszę zobaczyć odpowiedź ongle poniżej. Jest o wiele lepszy niż ten.

Aktualizacja po więcej informacji

Następujące zadziałały dla mnie. Przetestowałem go z nową usługą WCF, którą hostowałem na IIS za pośrednictwem Usługi1.svc.

  1. dodaj <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> do web config. <system.serviceModel>..</ ..> istniał już.
  2. dodaj AspNetCompatibilityRequirementsAttribute do serwisu z dozwolonym trybem.
  3. użyj HttpContext.Current.Server.MapPath(".");, aby uzyskać katalog główny.

Poniżej znajduje się Pełny kod dla klasy usług. Zrobiłem brak zmian w interfejsie IService1.

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

A poniżej fragment z sieci.config.

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

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

Stara odpowiedź

Co masz na myśli przez folder roboczy? Usługi WCF mogą być hostowane na kilka różnych sposobów i z różnymi punktami końcowymi, więc folder roboczy jest nieco niejednoznaczny.

Można pobrać normalny "Folder roboczy" wywołaniem do katalogu .GetCurrentDirectory () .

HttpContext jest ASP.Net obiekt. Nawet jeśli WCF może być hostowane na IIS, to nadal nie ASP.Net i z tego powodu większość ASP.Net techniki nie działają domyślnie. OperationContext jest odpowiednikiem WCF dla HttpContext. OperationContext zawiera między innymi informacje o przychodzącym żądaniu, wychodzącej odpowiedzi.

Choć najprostszym sposobem może być uruchomienie usługi w ASP.Net tryb zgodności poprzez włączenie go w sieci.config. To powinno dać ci dostęp do ASP.Net HttpContext. Ograniczy Cię do * HttpBindings i hosting IIS. Aby przełączyć tryb zgodności, dodaj następujące elementy do sieci web.config.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
 31
Author: Mikko Rantanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 19:58:07

W zależności od tego, czego chcesz. Zazwyczaj chcę rozwiązać adres URL, taki jak "~ / folder / file". To zadziałało.

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
 20
Author: Osa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-16 23:17:37

Bardziej ogólnie, używam tego

AppDomain.CurrentDomain.BaseDirectory
 17
Author: Khoa Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 09:24:16

AspNetCompatibilityEnabled = "true" powinien rozwiązać mój problem, ale mam ten błąd:

Serwer nie dostarczył znaczącej odpowiedzi; może to być spowodowane niedopasowaniem umowy, przedwczesnym zamknięciem sesji lub wewnętrznym błędem serwera.

Rozwiązałem problem z uzyskaniem fizycznej ścieżki uruchomionej usługi WCF, pobierając ją z bieżącej domeny aplikacji:

AppDomain.CurrentDomain.BaseDirectory
 12
Author: Stefan Filip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 10:24:13

W celu odniesienia ASP.NET funkcje takie jak obiekt HttpContext, musisz uruchomić aplikację WCF w ASP.NET tryb zgodności. Ten Artykuł wyjaśnia, jak to zrobić.

 3
Author: pmarflee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-26 19:52:41

Użyj Środowiska Hostingowego.ApplicationPhysicalPath in WCF to find your application physical path. Użyj przestrzeni nazw korzystanie z systemu.Www.Hosting;

 2
Author: Majid Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 09:00:39