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

StackOverflow https://stackoverflow.com/questions/791468

  •  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.

  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 могут размещаться несколькими различными способами и с разными конечными точками, поэтому рабочая папка немного неоднозначна.

Вы можете получить обычную "Рабочую папку" с помощью вызова Каталог.Получить 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;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top