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

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

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

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

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


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

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

7 ответов

Решение

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

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

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

Пожалуйста, смотрите ответ 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>

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

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

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

AppDomain.CurrentDomain.BaseDirectory

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

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

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

AppDomain.CurrentDomain.BaseDirectory

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

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

Другие вопросы по тегам