Определите, работает ли приложение ASP.NET локально

79

Я хочу знать, есть ли рекомендуемый способ определения того, работает ли приложение asp локально. На данный момент я использую объект Request и выполняю строковый поиск localhost или 127.0.0.1 в переменной сервера, но это имеет несколько ограничений. Самая большая проблема в том, что объект Request не всегда доступен, когда мне это нужно.

Шон
источник

Ответы:

148

См. HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;
Рекс М
источник
7
А как насчет того, где Request - null т.е. Application_start?
Meh Man
@mm Contemporary во время Application_Start нет запроса, нет причин проверять, есть ли Request.IsLocal или нет. Если вы хотите использовать его в Global.asax, подумайте об использовании его внутри Application_BeginRequest.
Vinicius Rocha,
1
@ViniciusRocha В некотором сценарии мы хотим проверить, что, когда Request имеет значение null.
Meh Man
У нас есть UnityContainer для разрешения внедрения зависимостей. У нас есть зависимость IEnvironment, которая сообщает нам, является ли она локальной, промежуточной или производственной. Нам нужно решить эту проблему, когда запрос равен нулю.
Ник Ниблинг,
1
@NickNiebling Кажется путаница в терминах ... Я думаю, что этот вопрос касается определения того, исходит ли текущий запрос с машины, на которой выполняется веб-приложение - что, конечно, имеет смысл только в том случае, если есть текущий запрос. Похоже, вы, возможно, действительно имеете в виду, работает ли он на производственной, промежуточной или разработанной машине? Что касается того, как это определить, я думаю, только вы можете решить, как их различать. Конфигурационный файл? Шаблон имени машины? Имя системной учетной записи, которая запускает движок ASP.Net?
Оскар Берггрен,
12

Вы можете проверить свойство Request.IsLocal

Адам
источник
6

Это сработало для меня с Application_Start

if (!HostingEnvironment.IsDevelopmentEnvironment)
{
      GlobalFilters.Filters.Add(new RequireHttpsAttribute());
}

Чтобы узнать больше о том, как устанавливается IsDevelopmentEnvironment, просмотрите следующий поток.

Что определяет значение HostingEnvironment.IsDevelopmentEnvironment в ASP.NET?

Сумант
источник
Есть и обратное, если кто-то блокирует это: HostingEnvironment.IsHosted
G43beli
4

В представлении MVC / странице ASP / коде за классом:

bool isLocal = HttpContext.Current.Request.IsLocal;

В контроллере MVC:

bool isLocal = Request.IsLocal;
Дамиан Фогель
источник
1

Request.IsLocal - это то же самое, что и проверка 127.0.0.1 или :: 1. См. Этот пост: http://forums.asp.net/p/1065813/4081335.aspx .

ZLA
источник
2
Да, но использование стандартного вызова библиотеки лучше передает намерение кода, ИМО. Я бы предпочел использовать библиотеку, а не писать свой собственный код, чтобы сделать такую ​​простую вещь.
Шон
Я согласен. Я просто хотел указать, что, поскольку обозначенный ответ может быть тем же кодом, что и плакат, ответ может иметь те же ограничения.
ZLA
1
Эта ссылка неверна. Если я попадаю на свой сервер локально через его IP-адрес, HttpContext.Current.Request.IsLocal правильно возвращает true, но UserHostAddress - это реальный IP-адрес, а не 127.0.0.1 (или :: 1). Протестировано в .NET 4.
mhenry1384
как указывает mhenry1384 .. IsLocalтакже относится к тому, когда вы посещаете сайт IIS с ЖЕСТКОГО компьютера. При этом также по умолчанию отображаются подробные сообщения об ошибках YSOD при входе с локального компьютера.
Петр Кула
1

Если HttpContext.Current не равен null, используйте

HttpContext.Current.Request.IsLocal

В противном случае, например, в App_Start или до того, как HttpContext.Current станет доступен, вы можете протестировать

HostingEnvironment.ApplicationPhysicalPath.StartsWith(@"C:\")

или выделенный диск на вашем ПК.

Другой способ - использовать постоянную переменную компиляции, установленную в производственной среде, например, из Azure и visualstudio.com, если вы их используете.

Он грязный, но работает.

Маттео Мильоре
источник
0

Запрос не всегда доступен в среде ASP.NET?

HttpContext и его свойства Request / Response инициализируются, как только сервер начинает обрабатывать страницу. Таким образом, в любом месте, где вы можете выполнить код C # в жизненном цикле своей страницы, вы должны иметь возможность проверить URL-адрес запроса.

Роман Ройтер
источник
Я не понимал, что могу использовать класс HttpContext для доступа к объекту Request.
Шон
Из любопытства, какой еще метод доступа к объекту Request доступен? Спасибо :)
Роман Ройтер
6
Да, объекты Request и HttpContext не всегда доступны в приложении ASP.NET. Например Application_Start, выполняется без HTTPContext.
Максим Ви.
1
@RomanR. рабочие места, созданные в, Application_Startмогут всегда выполняться в фоновом режиме. Также вопрос не имеет ничего общего с запросами страниц.
Максим Ви.
1
^ Итак, на что вы полагаетесь?
eaglei22
0

В ответ на комментарий @Meh Men's для другого ответа в этой теме, который спросил:

А как насчет того, где Request имеет значение null. т.е. Application_start?

Если вы уверены, что ваша производственная и тестовая или «гомологичные» версии вашего веб-сайта будут развернуты с выпускной версией вашего веб-сайта, в то время как ваша локальная среда будет построена и разработана в режиме «отладки», вы можете использовать #if DEBUGsintax для напишите код, который должен запускаться только локально, а за пределами этого блока или даже внутри соответствующего #elseблока, вы можете написать другой код, который вы хотите запускать только тогда, когда он не локально (например: удаленно).

Вот небольшой пример того, как я решил эту проблему в конкретном проекте, над которым я сейчас работаю:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".
Улисс Алвес
источник