Как получить рабочий путь приложения 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.
- добавлять
<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 является эквивалентом 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;