Как получить рабочий путь приложения wcf? - PullRequest
68 голосов
/ 26 апреля 2009

Я хочу получить рабочую папку приложения WCF. Как я могу получить это?

Если я попытаюсь

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

Я получаю исключение нулевой ссылки (объект Http.Current равен нулю).


Под рабочей папкой я имел в виду папку, в которой работает моя служба WCF. Если я установлю aspNetCompatibilityEnabled="true", я получу эту ошибку:

Сервер не предоставил значимого ответа; это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера.

Ответы [ 7 ]

169 голосов
/ 03 июня 2009

Мне понадобилась та же информация для моего приложения WCF, размещенного на IIS6, и я обнаружил, что это работает для меня:

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

Как всегда, YMMV.

31 голосов
/ 26 апреля 2009

Пожалуйста, смотрите ответ ongle ниже. Это намного лучше, чем этот.

Обновлено после получения дополнительной информации

Следующее сработало для меня. Я протестировал его с новой службой WCF, которую я размещал на IIS через Service1.svc.

  1. Добавить <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> в веб-конфигурацию. <system.serviceModel>..</ ..> уже существует.
  2. Добавить AspNetCompatibilityRequirementsAttribute к услуге с разрешенным режимом.
  3. Используйте HttpContext.Current.Server.MapPath(".");, чтобы получить корневой каталог.

Ниже приведен полный код класса обслуживания. Я не внес никаких изменений в интерфейс IService1.

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

А ниже приведен отрывок из файла web.config.

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

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

Старый ответ

Что вы подразумеваете под рабочей папкой? Службы WCF можно размещать несколькими различными способами и с разными конечными точками, поэтому рабочая папка выглядит несколько неоднозначно.

Вы можете получить обычную «Рабочую папку» с помощью вызова Directory.GetCurrentDirectory () .

HttpContext - это объект ASP.Net. Даже если WCF можно разместить на IIS, он все равно не является ASP.Net, и по этой причине большинство методов ASP.Net не работают по умолчанию. OperationContext является эквивалентом HttpContext в WCF. OperationContext, помимо прочего, содержит информацию о входящем запросе, исходящем ответе.

Хотя проще всего запустить службу в режиме совместимости с ASP.Net , переключив его в web.config. Это должно дать вам доступ к ASP.Net HttpContext. Это будет ограничивать вас * HttpBindings и IIS хостингом. Чтобы переключить режим совместимости, добавьте в файл web.config следующее.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
20 голосов
/ 01 марта 2010

В зависимости от того, что вы хотите. Я обычно хочу разрешить URL-адрес, как "~ / папка / файл". Это то, что сработало.

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
18 голосов
/ 04 июня 2013

Более общий, я использую этот

AppDomain.CurrentDomain.BaseDirectory
12 голосов
/ 27 апреля 2009

aspNetCompatibilityEnabled = "true" должно было решить мою проблему, но я получил эту ошибку:

Сервер не предоставил значимого ответа; это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера.

Я решил проблему с получением физического пути к моей работающей службе WCF, получив его из моего текущего домена приложения:

AppDomain.CurrentDomain.BaseDirectory
3 голосов
/ 26 апреля 2009

Чтобы ссылаться на такие функции ASP.NET, как объект HttpContext, необходимо запустить приложение WCF в режиме совместимости с ASP.NET. Эта статья объясняет, как это сделать.

2 голосов
/ 09 мая 2011

Используйте HostingEnvironment.ApplicationPhysicalPath в WCF, чтобы найти физический путь вашего приложения. Использовать пространство имен использование System.Web.Hosting;

...