Как получить рабочий путь приложения wcf?

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

Если я попробую

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

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


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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

  • Добавьте <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> в веб-конфигурацию. <system.serviceModel>..</ ..> уже существует.
  • Добавить AspNetCompatibilityRequirementsAttribute в службу с разрешенным режимом.
  • Используйте 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 - эквивалент WCF для HttpContext. В OperationContext содержится информация о входящем запросе, исходящий ответ между прочим.

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

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

Ответ 3

В зависимости от того, что вы хотите. Обычно я хочу разрешить URL-адрес, например "~/folder/file". Это то, что сработало.

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

Ответ 4

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

AppDomain.CurrentDomain.BaseDirectory

Ответ 5

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

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

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

AppDomain.CurrentDomain.BaseDirectory

Ответ 6

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

Ответ 7

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