2013-07-23 45 views
5

Máy tính của tôi nằm phía sau một bộ định tuyến chuyển tiếp cổng 80 tới nó (như cổng 80). Vấn đề của tôi là HttpListener dường như bỏ qua các yêu cầu được gửi đến địa chỉ IP bên ngoài.Tại sao HttpListener bỏ qua các yêu cầu bên ngoài?

Sự cố không phải với bộ định tuyến; nếu tôi tạo ra một giao diện điều khiển dự án C# trống và thêm chỉ các dòng mã sau đây:

System.Net.Sockets.TcpListener s = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 80); 
s.Start(); 
System.Net.Sockets.TcpClient c = s.AcceptTcpClient(); 

... và chạy chương trình [lưu ý: lần đầu tiên chương trình này được điều hành, người dùng có thể phải cho phép tường lửa ngoại lệ], nó sẽ chấm dứt nếu tôi hướng đến

http://localhost/testpath/ 

trong trình duyệt của tôi hOẶC nếu tôi hướng đến

http://externalipaddress/testpath/ 

trong trình duyệt của tôi - một trong hai địa chỉ cố gắng thành công một kết nối cổng 80. Vì vậy, tất cả mọi thứ được thiết lập đúng - máy tính này có thể chấp nhận các kết nối nội bộ và bên ngoài trên cổng 80.

Bây giờ, nếu tôi có thể tạo một giao diện điều khiển dự án C# trống và thêm chỉ các dòng mã sau đây:

System.Net.HttpListener s = new System.Net.HttpListener(); 
s.Prefixes.Add("http://+:80/testpath/"); 
s.Start(); 
System.Net.HttpListenerContext c = s.GetContext(); 

... đầu tiên, tôi sẽ nhận được một HttpListenerException nói Truy cập bị từ chối vì các vấn đề được đề cập trong this question. Sau đó, nó sẽ chạy đúng khi tôi đóng Visual Studio và mở lại nó như là quản trị viên. Chương trình sẽ kết thúc (đúng) khi tôi hướng đến

http://localhost/testpath/ 

Tuy nhiên, yêu cầu của tôi chỉ đơn giản là lần ra nếu tôi hướng đến

http://externalipaddress/testpath/ 

Tại sao yêu cầu bên ngoài của tôi để HttpListener thời gian ra? Kết quả có thể tái sản xuất bằng địa chỉ IP số hoặc tên miền cho 'externalipaddress', cũng như nhiều hoán vị của thư mục con, dấu gạch chéo, v.v ... và cũng cho tiền tố "http: // *: 80/testpath /", "http : // externaldomain: 80/testpath/"và" http: // externalipaddress: 80/testpath/"(không có dấu cách; được thêm cho định dạng ngăn xếp).

+1

Bạn đã hỏi ISP của mình liệu họ có chặn các kết nối đến trên cổng 80 không? Nó không phổ biến nhưng một số thì có. Đồng thời cố gắng giải quyết IP bên ngoài của bạn để nó trỏ đến 'homeusr51363_516.your_isp.com' hoặc tương tự – rath

+0

Nếu ISP của tôi chặn các kết nối đến, thì thành công của mã đầu tiên (kết nối tới cổng 80 thông qua địa chỉ IP bên ngoài) giải thích? Như đã lưu ý, tôi đã thử sử dụng địa chỉ IP dạng số và tên miền có thể phân giải trong các yêu cầu của trình duyệt. – Ben

Trả lời

6

Hóa ra tường lửa Windows đã âm thầm ăn 80 cổng đến yêu cầu từ bên ngoài máy chủ cục bộ. Khi tôi vô hiệu hóa tường lửa, HttpListener đã phát hiện các yêu cầu bên ngoài. Khi tôi kích hoạt lại tường lửa, HttpListener đã ngừng phát hiện các yêu cầu bên ngoài. Khi tôi kích hoạt quy tắc Inbound bị vô hiệu hóa có tên "BranchCache Content Retrieval (HTTP-In)" cho phép chương trình SYSTEM (mà lưu trữ dịch vụ TCP lắng nghe HttpListener) để nghe trên cổng 80, thì HttpListener lại phát hiện ra các yêu cầu bên ngoài.

Để tìm danh sách Inbound Rules trên Windows 7, Start -> Control Panel -> System and Security -> Windows Firewall -> Advanced Settings -> Inbound Rules.

+2

Đây là một vấn đề lớn. Tôi không muốn thêm một ngoại lệ tường lửa cho cổng tôi đang sử dụng. IMHO đây là một thực hành tồi. Vẫn không có giải pháp về điều đó? – Filimindji

+1

Theo định nghĩa của tường lửa, phải có ngoại lệ tường lửa cho cổng bạn muốn sử dụng. Khó khăn ở đây là HttpListener sử dụng một cái gì đó bên ngoài chương trình của bạn để nghe trên cổng 80, vì vậy chỉ cần cho phép một ngoại lệ tường lửa cho chương trình của bạn là không đủ để HttpListener được phép nghe kết nối. – Ben

+0

Cảm ơn bạn Ben, bạn đã giúp tôi hiểu vấn đề. Nó trông giống như với tôi rằng đây vẫn là một vấn đề an ninh, nhưng vì không có giải pháp khác, tôi sẽ làm theo lời khuyên của bạn. – Filimindji

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