2012-01-12 16 views
14

Sử dụng yêu cầu hiện tại tôi có thể lấy hostname URL với:Xác định tên máy chủ URL mà không sử dụng HttpContext.Current?

HttpContext.Current.Request.Url.Host 

Nhưng - Tôi cần phải xác định hostname URL mà không sử dụng các yêu cầu hiện tại (HttpContext.Current). Lý do cho điều này là mã của tôi được gọi từ một số SqlDependency trong gọi lại onChange khi tìm thấy một phụ thuộc SQL. Althougth mã nằm trong ứng dụng web của tôi, không có yêu cầu, và HttpContext.Current là null.

Tôi đã hy vọng tôi có thể lấy nó từ HttpRuntime, nhưng dường như không có bất cứ điều gì sử dụng ở đó. có cách nào để tôi có thể nhận được thông tin này không?

+0

Một trong những trang web của chúng tôi đáp ứng bất kỳ tên máy chủ được cung cấp. Nếu không kiểm tra yêu cầu đến, sẽ rất khó để xác định tên máy chủ được sử dụng để liên lạc với chúng tôi. – spender

+0

Bạn đang cố gắng làm gì và khi nào mã của bạn đang chạy? Có phải trong sự kiện OnChange của SqlDependency, trong onRemoveCallback của App Cache hoặc ở một nơi khác không? – Journey

+0

Đã chỉnh sửa câu hỏi để rõ ràng –

Trả lời

3

Nếu bạn biết các máy chủ tại thời điểm bạn đang thiết lập xử lý sự kiện sau đó bạn sẽ có thể làm điều gì đó tương tự (mã không thực sự thử nghiệm):

string host = HttpContext.Current.Request.Url.Host; 
var dep = new SqlDependency(cmd); 
dep.OnChange += ((sender, args) => 
{ 
    DoStuff(host); 
}); 
+0

Chúc mừng, tôi cũng đã tham gia quá trình này, vì vậy giả sử tôi có thể chuyển mã của tôi ra khỏi Application_OnStart thành một thứ như Session_OnStart (để tạo đối tượng Yêu cầu avaialable), tôi có thể chuyển vào máy chủ như bạn đề xuất. –

4

Làm thế nào về

Environment.MachineName 
+0

Xin lỗi, thao tác này sẽ không hoạt động, tôi có nhiều phiên bản trên cùng một hộp, với các liên kết máy chủ khác nhau (site1.xxx.com, site2.xxx.com, v.v.) –

+0

Tôi tự hỏi liệu có thể thực hiện được không để xác định ngữ cảnh mà mã của bạn thực hiện nếu HttpContext bị thiếu (như bạn đã nói). –

1

Bạn nên sử dụng api IIS để truy vấn thông tin từ trang web bạn đang tìm kiếm. Bởi vì tùy thuộc vào cấu hình IIS, URL hoặc Tên máy chủ của bạn có thể khác nhau. (Hãy suy nghĩ về hostheaders, bến cảng, các giao thức và các công cụ như thế này.

Một giới thiệu cho IIS API có thể được tìm thấy tại http://learn.iis.net/page.aspx/165/how-to-use-microsoftwebadministration/

+0

Điều này giống như cách duy nhất để làm điều đó, tuy nhiên, nó đòi hỏi thêm quyền để thẩm vấn IIS, vì vậy tôi nghĩ rằng tôi có thể cần phải xem nếu tôi có thể mã vòng vấn đề này. –

6

Nếu bạn đang chạy này từ một ứng dụng web, và nó là tất cả các mã được quản lý sau đó HttpContext phải Thư viện con của bạn (giả sử mã được quản lý của bạn nằm trong thư viện) có tham chiếu đến System.Web không? Nếu không, hãy xem xét thêm tham chiếu này, từ đó bạn có thể truy cập trực tiếp vào HttpContext bằng cách sử dụng không gian tên đầy đủ :

System.Web.HttpContext.Current.Request.Url.Host 

Trong mọi trường hợp, trừ khi mã của bạn là không được quản lý hoặc con của bạn văn bản thực sự không bắt nguồn từ một ứng dụng web, HttpContext sẽ có sẵn ở mọi điểm trong khi luồng vẫn còn sống.

Chỉnh sửa:
Dựa trên đọc nhận xét của bạn bên dưới, có vẻ như SqlDependency đang được kích hoạt độc lập. Trong khi nó nằm trên cùng một chuỗi, nó không được kích hoạt trực tiếp bởi yêu cầu. Vì tất cả những gì bạn đang tìm kiếm là url của máy chủ lưu trữ, nên bạn không thể tạo ra một biến ứng dụng hoặc biến tĩnh để giữ thông tin này trong trường hợp cần thiết cho sự phụ thuộc.

Cũng có điều tôi đã thấy là trong khi HttpContext.Current có thể không khả dụng, HttpContext.Request có thể. Đây phải là cùng một đối tượng, nhưng chúng có thể không nhất thiết phải là. Có thể Máy chủ có thể được tìm thấy ở đó.

+1

HttpContext tồn tại, nhưng HttpContext.Current (đó là yêu cầu hiện tại) không, bởi vì mã trong ứng dụng web không được kích hoạt bởi một yêu cầu, nó được kích hoạt bởi hàm SQL Dependency callback, do đó nó là null. –

+0

Bạn có thể đặt trường Trang thành 'HttpContext.Current' (ví dụ: _currentContext) và truy cập vào trường gọi lại không? – jrummell

+0

@MattRoberts: Đã đăng chỉnh sửa. –

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