2012-05-03 37 views
16

Tôi muốn di chuyển đoạn mã sau từ tệp C# aspx.cs vào tệp class.cs độc lập.Tại sao tên 'Yêu cầu' không tồn tại khi viết trong một tệp class.cs?

string getIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if (String.IsNullOrEmpty(getIP)) getIP = Request.ServerVariables["REMOTE_ADDR"]; 

Đoạn mã này được sử dụng để cư trú trong page_load của tệp aspx.cs chỉ hoạt động tốt, nhưng nó gây ra lỗi trong tệp lớp.

'Yêu cầu' không cần 'sử dụng' khi ở trong tệp aspx.cs và không cung cấp gì trong ngữ cảnh này.

Làm cách nào để giải quyết vấn đề này?

Trả lời

41

Request là thuộc tính của lớp trang. Do đó bạn không thể truy cập nó từ một lớp "độc lập".

Tuy nhiên, bạn có thể nhận được HttpRequest nào qua HttpContext.Current

var request = HttpContext.Current.Request; 

Lưu ý rằng điều này làm việc ngay cả trong một phương pháp tĩnh. Nhưng chỉ khi bạn đang ở trong một HttpContext (do đó không phải trong một ứng dụng Winforms). Vì vậy, bạn cần đảm bảo rằng nó không phải null:

if (HttpContext.Current != null) 
{ 
    var request = HttpContext.Current.Request; 
} 

Sửa: Tất nhiên bạn cũng có thể vượt qua các yêu cầu như tham số cho phương thức mà tiêu thụ nó. Đây là thực hành tốt vì nó không hoạt động mà không có. Bằng cách này, mọi khách hàng sẽ biết ngay lập tức liệu lớp/phương thức này có hoạt động hay không.

+3

+1, nhưng trong những trường hợp này, tôi thường thích phương pháp lưu trữ mã để yêu cầu HttpContext làm tham số tham số (hoặc cấu trúc tương tự). Tôi muốn nhìn thấy một cái gì đó trong giao diện công cộng cho các loại mã này mong đợi một bối cảnh web. –

+1

Đồng ý với Joel – MikeTWebb

+0

Tôi cũng thế. Đã chỉnh sửa câu trả lời của tôi. –

1

Lý do nó không hoạt động là vì bạn không thể truy cập các biến máy chủ trong một dự án thư viện lớp.

Bạn nên tránh cố thực hiện hành động này như lớp web và thay vào đó chuyển thông tin bạn cần cho đối tượng lớp thông qua thông số bình thường.

Các vấn đề liên quan