Не могу добавить ссылку на System.Web.Hosting

Я переношу веб-приложение с VB на С#. Я также обновил до версии 3 в VS2013. Были ли изменения в классе Hosting? Я получаю сообщение об ошибке с помощью Hosting.HostingEnvironment.MapPath, и я даже не могу добавить ссылку на System.Web.Hosting, поскольку ее нигде не найти. Когда я пытаюсь выполнить поиск сборок при добавлении ссылки, используя все пространство имен i.e. System.Web.Hosting, он не возвращает результат.

У меня есть оператор using в классе, и он НЕ затенен, что означает, что он используется для чего-то, но код не нравится Hosting в Hosting.HostingEnvironment, поскольку он выглядит красноватым. Я даже не получаю класс Hosting в intellisense, и проект имеет ссылку на System.Web

Ответы

Ответ 1

Нет класса Hosting. Вместо этого вам нужен класс HostingEnvironment:

HostingEnvironment.MapPath("~/Hello.txt");

Полный тип HostingEnvironment равен System.Web.Hosting.HostingEnvironment, поэтому вам нужно иметь предложение using System.Web.Hosting; в файле или использовать полное имя.

Тем не менее, если вы создаете веб-приложение, вы, скорее всего, не захотите использовать HostingEnvironment. У вас всегда должен быть экземпляр, например. HttpContext или Page/Control, которые дают вам доступ к Server.MapPath, что должно быть предпочтительным.

Что касается ссылки, пространство имен System.Web.Hosting живет в System.Web.dll, поэтому просто убедитесь, что у вас есть ссылка на него, и вы должны быть в порядке.

Поскольку вы переносите это из VB, я предполагаю, что конфликт вызван тем, что VB использует обработку пространств имен. В С# вы не можете просто сделать это:

using System.Web;

Hosting.HostingEnvironment.DoWhatever();

При использовании пространства имен используйте либо полное имя типа, включая пространство имен, либо используйте использование в точном пространстве имен и тип. Сочетание двух не совсем работает.

Ответ 2

У меня была эта же проблема, это было нечто иное, чем то, что было опубликовано. Я смотрел код в библиотеке в отдельном проекте (Model). В библиотечном проекте, который я использовал, System.Web не ссылался.

Сложная часть заключалась в том, что ссылка System.Web.Http была указана, поэтому было найдено пространство имен System.Web, поэтому инструкция using System.Web; скомпилирована в порядке.

Сохраните некоторые проблемы и сердечную боль, всегда нажимайте кнопку "Синхронизировать с активным документом" в обозревателе решений, как показано в этом ответе. fooobar.com/questions/19830/...

Ответ 3

Вы пытаетесь использовать Server.MapPath в System.Web?

Ответ 4

Я не думаю, что вы можете использовать .NET Client Profile для создания веб-приложений?

В любом случае, это в стороне. Вы обнаружите, что пространства имен, как правило, повторно используются в разных сборках. Особенно в структурах, где они считают, что некоторые классы концептуально принадлежат друг другу, даже если они поддерживают разные технологии.

Я не уверен, что объяснил это хорошо, но возьму этот пример. Существует пространство имен System в mscorlib, System, System.Net, System.Core и System.Numerics. Кроме того, System.Web может отображаться в System.Web.Http или самом System.Web и других, таких как System.Web.Abstractions, System.Web.Optimization и т.д. В результате просто пытается использовать оператор using для распознавания сборка, из которой пришел определенный класс, действительно может вас отбросить.

Типичные классы в пространстве имен System.Web.Hosting находятся в сборке фреймов System.Web.dll. Microsoft пытается отменить прямое использование System.Web.dll в пользу более модульной реализации Katana/Kestrel.

Сказав это, убедитесь, что ваш проект напрямую ссылается на System.Web.dll. Чтобы использовать требуемый класс, обратитесь к нему по его полному имени, т.е. System.Web.Hosting.HostingEnvironment. Или положите using System.Web.Hosting; в начало вашего .cs файла.

В текущем классе может быть свойство, называемое HostingEnvironment, или класс из другого пространства имен в другой сборке с именем HostingEnvironment. В этом случае вам может потребоваться указать имя класса в полном объеме или создать прозвище для упрощения ссылки и уменьшить типизацию.

Например, вы могли бы иметь это в начале вашего файла:

using HostEnv = System.Web.Hosting.HostingEnvironment;

Затем где-то в теле вашего кода вы можете сделать ссылку на него таким образом:

var appHost = HostEnv.ApplicationHost;

Помогает ли это?

Для конкретного сценария, который вы хотите адресовать, вы можете сделать следующее:

var resolvedPath = HostEnv.MapPath(pathToMap);