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).
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
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