Yêu cầu gửi localhost trong ứng dụng Azure App Services


8

Tôi có một công việc web liên tục lắng nghe các yêu cầu chứa thông tin chẩn đoán.

Để kiểm tra kết nối, tôi cố gắng kiểm tra sức khỏe trong công việc web của mình nhưng không thể thực hiện yêu cầu tới localhost theo tài liệu dịch vụ ứng dụng azure.

Mã dưới đây là những gì tôi sử dụng để xác minh rằng tôi có thể kết nối từ ứng dụng tôi triển khai:

    var uri = new Uri("http://localhost:8989/ping");
    var response = await client.GetAsync(uri);

Tôi nhận được ngoại lệ này:

System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: Unable to connect to the remote server 
---> System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989

Công việc web được cài đặt thông qua tập lệnh cài đặt tiện ích mở rộng trang web thông qua Kudu (SCM), điều đó có nghĩa là công việc web cuối cùng là một quá trình con của Kudu (SCM). Ứng dụng công việc web khi khởi động liên kết với cổng 8989. Bắt đầu ứng dụng cục bộ trên windows, tôi có thể kiểm tra sức khỏe của mình mà không gặp vấn đề gì.

Tài liệu dịch vụ ứng dụng azure nói rằng các yêu cầu tới localhost sẽ không thành công trừ khi một ứng dụng trong cùng hộp cát liên kết với cổng ( https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#local-address- yêu cầu ).

Tài liệu dịch vụ ứng dụng azure nói rằng Kudu chạy trong cùng hộp cát với ứng dụng chính ( https://github.com/projectkudu/kudu/wiki/Kudu-arch architecture # security-model ).

Làm cách nào để tôi có thể liên lạc với công việc web của mình qua http?

Tốt hơn là đó là điều mà tôi có thể làm từ quy trình cài đặt tiện ích mở rộng trang web, nhưng mọi tùy chọn đều tốt.

Cập nhật 12-26-2019:

Tôi đã cố gắng buộc SCM và ứng dụng chính chạy trong cùng một hộp cát với WEBSITE_DISABLE_SCM_SEPARATION=true( https://github.com/projectkudu/kudu/wiki/Configurable-sinstall#use-the-same- Process-for-the-user- trang web và trang web scm ).

Tài liệu nói rằng họ đã chạy trong cùng một hộp cát và nếu một quy trình lắng nghe trên một cổng trong cùng một hộp cát, những yêu cầu đó sẽ hoạt động. Đáng chú ý, quá trình SCM w3wp.exe thực tế đã có thể truy cập localhost bằng http cho công việc web của tôi. Cài đặt này dường như không cải thiện tình hình.

Cập nhật ngày 04/02/2016:

Tôi chính thức từ bỏ ý tưởng sử dụng một công việc web và bây giờ tôi bắt đầu quá trình như một đứa trẻ của ví dụ ứng dụng chính. Điều này cho phép tôi giao tiếp localhost:8989mà không có vấn đề.

Mặc dù bây giờ tôi cần quản lý logic của riêng tôi.

Tôi vẫn muốn biết liệu có cách nào để giao tiếp qua TCP với một công việc web nếu điều đó là có thể.


Đây là câu hỏi tương tự nhất mà tôi đã tìm thấy: stackoverflow.com/questions/56572039/NH
colin-higgins

Vấn đề truy cập có thể phát sinh từ xác thực / ủy quyền cho Kudu. Vui lòng chia sẻ chi tiết về việc tạo cá thể khách hàng.
Igwe Kalu

Đây là trước khi yêu cầu thậm chí rời khỏi bối cảnh của ứng dụng
colin-higgins

1
Giống như tôi đã đề xuất trong câu trả lời của mình, các kết nối ổ cắm không được kích hoạt WebJobsvì chúng chạy bên trong một IHostcontainer. Chi tiết bổ sung có sẵn trong câu trả lời của tôi.
Igwe Kalu

1
Tài liệu Wiki trên GitHub không phải lúc nào cũng cập nhật. Cũng không phải tài liệu chính thức. Tôi nghi ngờ nếu điều này thậm chí được cho là hoạt động ...
Sean Feldman

Câu trả lời:


0

Làm cách nào để tôi có thể liên lạc với công việc web của mình qua http?

Không. WebJob không thể gửi yêu cầu trực tiếp đến trang web qua localhost . Giới hạn này được ghi lại trên trang hộp cát như bạn cung cấp.

Các nỗ lực kết nối đến các địa chỉ cục bộ (ví dụ localhost, 127.0.0.1) và IP riêng của máy sẽ không thành công, ngoại trừ nếu một quá trình khác trong cùng hộp cát đã tạo ra một ổ cắm nghe trên cổng đích.

Đã từ chối các nỗ lực kết nối, chẳng hạn như ví dụ sau cố gắng kết nối với 127.0.0.1:80, từ .NET sẽ dẫn đến ngoại lệ trên.

Để biết thêm chi tiết, bạn có thể tham khảo chủ đề SO này .


Bạn nói rằng công việc web không thể gửi yêu cầu đến trang web, nhưng tôi muốn hướng ngược lại. Ngoài ra, "ngoại trừ nếu một quá trình khác trong cùng hộp cát đã tạo ra một ổ cắm nghe trên cổng đích" khiến tôi tin rằng điều đó là có thể.
colin-higgins

0

Tôi tin rằng vấn đề liên quan đến cổng được gán cho ứng dụng của bạn (8989). Bạn sẽ cần sử dụng một dịch vụ khác (dịch vụ đám mây cũ), máy ảo hoặc Service Fabric để mở và nhận yêu cầu trên cổng 8989.

Thông tin thêm về nó:

Lắng nghe điểm cuối mạng Cách duy nhất để ứng dụng có thể được truy cập

thông qua internet thông qua các cổng TCP (80) và HTTPS (443) đã được phơi bày; các ứng dụng có thể không nghe trên các cổng khác đối với các gói đến từ internet. Tuy nhiên, các ứng dụng có thể tạo ra một ổ cắm có thể lắng nghe các kết nối từ trong hộp cát. Ví dụ: hai quy trình trong cùng một ứng dụng có thể giao tiếp với nhau thông qua các ổ cắm TCP; các nỗ lực kết nối đến từ bên ngoài hộp cát, mặc dù chúng nằm trên cùng một máy, sẽ không thành công. Xem chủ đề tiếp theo để biết thêm chi tiết.

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox


Nó cũng không hoạt động nếu tôi tự động chọn một cổng miễn phí.
colin-higgins

0

Bạn không nên triển khai máy chủ HTTP trong WebJob của mình vì đó không phải là cách chúng dự định được chạy.

Một WebJob về cơ bản được thực thi bên trong một thùng chứa Ihost được thiết kế cho các dịch vụ không đầu có thể tạo điều kiện cho các tác vụ xử lý nền. Không giống như IWebhost , Ihost không phù hợp để lưu trữ web.

Do đó, WebJob trong bạn đã tạo có thể không ràng buộc chính nó với cổng bạn đã đề cập. Nếu đúng như vậy, rất có thể chính sách bảo mật của hộp cát sẽ hạn chế quyền truy cập vào các ổ cắm tùy ý được tạo bởi người dùng khác với những người tiếp xúc để truy cập trang web và dịch vụ kudu của bạn. Điều này được chỉ định chính xác bởi " System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989" trong đoạn mã theo dõi ngăn xếp lỗi mà bạn đã chia sẻ.

Làm cách nào để tôi có thể liên lạc với công việc web của mình qua http? - Giao tiếp với WebJob có thể được thiết lập thông qua API WebJobs .

Bạn có thể phải tạo nhiều WebJob để đáp ứng các chức năng khác nhau do triển khai máy chủ HTTP đã cố gắng của bạn.

Người giới thiệu

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.