Не могу добавить ссылку на 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);
Ответ 5
Измените профиль вашей библиотеки с клиентом.
Изменение профиля клиента