Я хочу получить рабочую папку приложения 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;