Xác định xem ứng dụng ASP.NET có đang chạy cục bộ hay không


79

Tôi muốn biết liệu có cách nào được khuyến nghị để xác định xem ứng dụng asp có đang chạy cục bộ hay không. Hiện tại, tôi sử dụng đối tượng Request và thực hiện tìm kiếm chuỗi cho localhost hoặc 127.0.0.1 trên biến máy chủ nhưng điều này có một số hạn chế. Điểm lớn nhất là đối tượng Yêu cầu không phải lúc nào cũng có sẵn khi tôi cần.

Câu trả lời:


148

Xem HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;

7
Điều gì về nơi Yêu cầu là null. tức là: Application_start?
Meh Man

@mmtempional trong thời gian Application_Start không có yêu cầu, không có lý do gì để kiểm tra xem Request.IsLocal hay không. Nếu bạn muốn sử dụng nó trên Global.asax, hãy cân nhắc sử dụng nó bên trong Application_BeginRequest.
Vinicius Rocha

1
@ViniciusRocha Trong một số trường hợp, chúng tôi muốn kiểm tra xem khi Yêu cầu là rỗng.
Meh Man

Chúng tôi có UnityContainer để giải quyết việc tiêm phụ thuộc. Chúng tôi có sự phụ thuộc vào Môi trường cho chúng tôi biết đó là môi trường cục bộ, tổ chức hay sản xuất. Chúng tôi cần giải quyết vấn đề này khi yêu cầu không có giá trị.
Nick Niebling

1
@NickNiebling Có vẻ như có sự nhầm lẫn về thuật ngữ ... Tôi nghĩ câu hỏi này là về việc xác định xem yêu cầu hiện tại có phải đến từ máy thực thi ứng dụng web hay không - tất nhiên điều này chỉ có ý nghĩa nếu có yêu cầu hiện tại. Nghe có vẻ giống bạn Có lẽ thực sự có nghĩa là nếu nó chạy trên máy sản xuất, dàn dựng hoặc một nhà phát triển ? Về cách xác định điều đó, tôi nghĩ chỉ có bạn mới có thể quyết định cách phân biệt giữa chúng. Tập tin cấu hình? Mẫu tên máy? Tên tài khoản hệ thống thực thi công cụ ASP.Net?
Oskar Berggren

12

Bạn có thể kiểm tra thuộc tính Request.IsLocal


6

Điều này đã làm việc cho tôi với Application_Start

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

Để biết thêm về cách IsDevelopmentEnosystem được thiết lập, vui lòng xem chuỗi sau.

Trong ASP.NET, điều gì quyết định giá trị của HostingEnosystem.IsDevelopmentEnosystem?


Ngoài ra còn có điều ngược lại nếu có ai được khóa cho rằng: HostingEnvironment.IsHosted
G43beli

4

Trong chế độ xem MVC / trang ASP / mã phía sau lớp:

bool isLocal = HttpContext.Current.Request.IsLocal;

Trong bộ điều khiển MVC:

bool isLocal = Request.IsLocal;

1

Request.IsLocal giống như kiểm tra 127.0.0.1 hoặc :: 1. Xem bài đăng này: http://forums.asp.net/p/1065813/4081335.aspx .


2
Có, nhưng sử dụng lệnh gọi thư viện chuẩn sẽ truyền tải ý định của mã tốt hơn, IMO. Tôi thích sử dụng thư viện hơn là viết mã của riêng mình để làm một việc đơn giản như vậy.
Sean

Tôi đồng ý. Tôi chỉ muốn chỉ ra rằng vì câu trả lời được chỉ định có thể giống với mã mà người đăng đang sử dụng, câu trả lời có thể có cùng những hạn chế.
ZLA

1
Liên kết đó không chính xác. Nếu tôi truy cập cục bộ máy chủ của mình thông qua Địa chỉ IP của nó, HttpContext.Current.Request.IsLocal trả về true, nhưng UserHostAddress là địa chỉ IP thực, không phải 127.0.0.1 (hoặc :: 1). Thử nghiệm trong .NET 4.
mhenry1384

như mhenry1384 chỉ ra .. IsLocalcũng đề cập đến khi bạn truy cập trang web IIS từ máy CÙNG. Làm như vậy cũng hiển thị các thông báo lỗi chi tiết YSOD theo mặc định, khi đến từ máy cục bộ.
Piotr Kula,

1

Nếu HttpContext.Current không sử dụng null

HttpContext.Current.Request.IsLocal

Nếu không, chẳng hạn như trong App_Start hoặc trước khi có HttpContext.Current, bạn có thể kiểm tra

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

hoặc một đĩa chuyên dụng trên PC của bạn.

Một cách khác có thể là sử dụng bộ biến biên dịch không đổi trong sản xuất, ví dụ như từ Azure và visualstudio.com nếu bạn sử dụng chúng.

Nó là bẩn, nhưng nó hoạt động.


0

Yêu cầu không phải lúc nào cũng có sẵn trong môi trường ASP.NET?

HttpContext và các thuộc tính của nó Request / Response được khởi tạo ngay khi máy chủ bắt đầu xử lý trang. Vì vậy, tại bất kỳ nơi nào bạn có thể thực thi mã c # trong vòng đời trang của mình, bạn sẽ có thể kiểm tra url yêu cầu.


Tôi không nhận ra rằng tôi có thể sử dụng lớp HttpContext để truy cập đối tượng Yêu cầu.
Sean

Vì tò mò, có phương pháp nào khác để truy cập đối tượng Yêu cầu không? Cảm ơn :)
Roman Royter

6
Có, các đối tượng Request và HttpContext không phải lúc nào cũng có sẵn trong ứng dụng ASP.NET. Ví dụ: Application_Startđược thực thi không có HTTPContext.
Maksim Vi.

1
@RomanR. các công việc được tạo trong Application_Startcó thể luôn chạy trên nền. Ngoài ra câu hỏi không liên quan gì đến yêu cầu trang.
Maksim Vi.

1
^ Vậy thì bạn dựa vào cái gì?
Eaglei22

0

Để trả lời nhận xét của @Meh Men cho câu trả lời khác trong chủ đề này, người đã hỏi:

Điều gì về nơi Yêu cầu là null. tức là: Application_start?

Nếu bạn chắc chắn rằng các phiên bản sản xuất và thử nghiệm hoặc phiên bản "tương đồng" của trang web đều sẽ được triển khai cùng với phiên bản phát hành của trang web, trong khi môi trường cục bộ của bạn sẽ được xây dựng và phát triển ở chế độ "gỡ lỗi", bạn có thể sử dụng #if DEBUGsintax để viết mã chỉ nên chạy cục bộ, trong khi bên ngoài khối này, hoặc thậm chí bên trong một #elsekhối phù hợp , bạn có thể viết một số mã khác mà bạn chỉ muốn chạy khi không chạy cục bộ (ví dụ: từ xa).

Đây là một ví dụ nhỏ về cách tôi đã giải quyết vấn đề này trong một dự án cụ thể mà tôi đang thực hiện:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.