Визначте, чи працює програма ASP.NET локально


79

Я хочу знати, чи є рекомендований спосіб визначити, чи працює програма asp локально. На даний момент я використовую об'єкт Request і виконую рядовий пошук localhost або 127.0.0.1 за змінною сервера, але це має кілька обмежень. Найбільше, що об’єкт Request не завжди доступний, коли мені це потрібно.

Відповіді:


148

Див. HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;

7
Як щодо того, де запит нульовий. тобто: Application_start?
Meh Man

@mmtemporary під час Application_Start немає запиту, немає причин перевіряти, чи є Request.IsLocal чи ні. Якщо ви хочете використовувати його на Global.asax, розгляньте можливість використання його в Application_BeginRequest.
Vinicius Rocha,

1
@ViniciusRocha У деяких сценаріях ми хочемо перевірити, якщо Request має значення null.
Meh Man

У нас є UnityContainer для вирішення введення залежностей. У нас є залежність від IEnvironment, яка повідомляє нам, чи є вона локальною, постановочною чи виробничою. Нам потрібно вирішити це, коли запит є нульовим.
Нік Ніблінг,

1
@NickNiebling Схоже на плутанину термінів ... Я думаю, це питання стосується визначення, чи надходить поточний запит від машини, яка виконує веб-додаток - що, звичайно, має сенс лише за наявності поточного запиту. Це схоже на вас, можливо, ви дійсно маєте на увазі, якщо він працює на виробництві, постановці чи розробнику ? Щодо того, як це визначити, я думаю, що тільки ви можете вирішити, як їх розрізняти. Файл конфігурації? Шаблон назви машини? Назва системного облікового запису, який виконує механізм ASP.Net?
Оскар Берггрен,


6

Це спрацювало для мене з Application_Start

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

Щоб дізнатись більше про те, як встановлюється IsDevelopmentEnvironment, перегляньте наступну тему.

Що в ASP.NET визначає значення HostingEnvironment.IsDevelopmentEnvironment?


Існує також протилежне, якщо хтось замикається на це: 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 .


2
Так, але використання стандартного виклику бібліотеки передає намір коду краще, IMO. Я волів би скористатися бібліотекою, аніж писати власний код, щоб зробити таку просту справу.
Шон

Я згоден. Я просто хотів зазначити, що оскільки призначена відповідь може бути тим самим кодом, що і той, що використовував плакат, відповідь може мати ті самі обмеження.
ZLA

1
Це посилання не є правильним. Якщо я вдарив свій сервер локально через його IP-адресу, HttpContext.Current.Request.IsLocal правильно повертає true, але UserHostAddress - це справжня IP-адреса, а не 127.0.0.1 (або :: 1). Перевірено в .NET 4.
mhenry1384

як зазначає mhenry1384 .. IsLocalтакож стосується, коли ви відвідуєте веб-сайт IIS з тієї ж машини. Це також також відображає детальні повідомлення про помилки YSOD за замовчуванням, коли надходить з локальної машини.
Piotr Kula

1

Якщо HttpContext.Current не є нульовим значенням

HttpContext.Current.Request.IsLocal

В іншому випадку, наприклад, у App_Start або до того, як доступний HttpContext.Current, ви можете протестувати

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

або спеціальний диск на вашому ПК.

Іншим способом може бути використання постійної змінної компіляції, встановленої у виробництві, наприклад, з Azure та visualstudio.com, якщо ви їх використовуєте.

Це брудно, але це працює.


0

Запит не завжди доступний в середовищі ASP.NET?

HttpContext та його властивості Запит / Відповідь ініціалізуються, як тільки сервер починає обробку сторінки. Отже, у будь-якому місці ви можете виконати код c # у життєвому циклі сторінки, ви повинні мати можливість перевірити URL-адресу запиту.


Я не розумів, що можу використовувати клас HttpContext для доступу до об'єкта Request.
Шон,

З цікавості, який ще спосіб доступу до об’єкта Запит доступний? Дякую :)
Роман Ройтер

6
Так, об’єкти Request та HttpContext не завжди доступні у програмі ASP.NET. Наприклад Application_Start, виконується без HTTPContext.
Максим Ві.

1
@RomanR. робочі місця, створені в, Application_Startможуть завжди працювати у фоновому режимі. Також питання не має нічого спільного із запитами сторінок.
Максим Ві.

1
^ Тоді на що ви покладаєтесь?
eaglei22

0

У відповідь на коментар @Meh Men щодо іншої відповіді в цій темі, який запитав:

Як щодо того, де запит нульовий. тобто: Application_start?

Якщо ви впевнені, що ваша виробнича та тестова версії або "гомологічні" версії вашого веб-сайту будуть розгорнуті разом із випусковою версією вашого веб-сайту, тоді як ваше локальне середовище буде створюватися та розроблятися в режимі "налагодження", ви можете використовувати #if DEBUGsintax для написати код, який слід запускати лише локально, тоді як поза цим блоком або навіть всередині відповідного #elseблоку ви можете написати якийсь інший код, який ви хочете запускати лише тоді, коли не локально (наприклад: віддалено).

Ось невеликий зразок того, як я вирішив цю проблему в конкретному проекті, над яким я зараз працюю:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.