Как получить рабочий путь к приложению wcf?
-
16-09-2019 - |
Вопрос
Я хочу получить рабочую папку приложения WCF.Как я могу это получить?
Если я попытаюсь
HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)
Я получаю исключение с нулевой ссылкой (объект Http.Current равен null).
Говоря о рабочей папке, я имел в виду папку, в которой запущена моя служба WCF.Если я установлю aspNetCompatibilityEnabled="true"
, Я получаю эту ошибку:
Сервер не предоставил содержательного ответа;это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера.
Решение
Мне нужна была та же информация для моего приложения 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 могут размещаться несколькими различными способами и с разными конечными точками, поэтому рабочая папка немного неоднозначна.
Вы можете получить обычную "Рабочую папку" с помощью вызова Каталог.Получить CurrentDirectory().
HttpContext - это ASP.Сетевой объект.Даже если WCF может быть размещен в IIS, это все равно не ASP.Net и по этой причине большинство методов ASP.Net по умолчанию не работают.OperationContext - это эквивалент HttpContext в WCF.OperationContext содержит информацию о входящем запросе, исходящем ответе, среди прочего.
Хотя самым простым способом может быть запуск службы в ASP.Режим сетевой совместимости переключив его в 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;