2010-05-27 32 views
18

Tôi đang tìm cách viết một dịch vụ web nhỏ để chạy trên một hộp Linux nhỏ. Tôi thích viết mã trong C#, vì vậy tôi đang tìm cách sử dụng Mono.HttpListener có hoạt động tốt trên Mono không?

Tôi không muốn sử dụng máy chủ web đầy đủ hoặc phiên bản ASP.NET của Mono. Tôi đang nghĩ đến việc có một quy trình duy nhất với một chuỗi xử lý với từng kết nối máy khách. Bộ nhớ chia sẻ giữa các chủ đề thay vì một cơ sở dữ liệu.

Tôi đã đọc một chút về phiên bản HttpListener của Microsoft và cách nó hoạt động với trình điều khiển Http.sys. Than ôi, tài liệu của Mono về lớp này chỉ là giao diện lớp tự động mà không có thảo luận về cách nó hoạt động dưới mui xe. (Linux không có Http.sys, vì vậy tôi tưởng tượng nó được thực hiện một cách đáng kể khác nhau.)

Có ai chỉ cho tôi một số tài nguyên thảo luận về mô-đun này không?

Rất cám ơn, Bill, billpg.com

(Một nền chút cho câu hỏi của tôi cho những người quan tâm.)

Một số thời gian trước đây, tôi hỏi this question, quan tâm đến việc giữ một cuộc trò chuyện dài mở với rất nhiều qua lại. Tôi đã quyết định thiết kế giao thức ad-hoc của riêng mình, nhưng những người tôi đã nói thực sự muốn có một giao diện REST, ngay cả với chi phí của tín hiệu "Được rồi, gửi lệnh của bạn ngay bây giờ".

Vì vậy, tôi tự hỏi về việc chạy ASP.NET trên máy chủ Linux/Mono, nhưng tình cờ gặp HttpListener. Điều này có vẻ lý tưởng, vì mỗi "cuộc trò chuyện" có thể chạy trong một chủ đề riêng biệt. Các thread mà gọi HttpListener trong một vòng lặp có thể tìm kiếm mà thread mỗi incomming kết nối là cho và vượt qua tham chiếu đến chủ đề đó.

Cách thay thế cho dịch vụ định hướng ASP.NET, sẽ có mã ASPX nhận trạng thái từ cơ sở dữ liệu và ghi lại trạng thái mới khi kết thúc. Có, nó sẽ hoạt động, nhưng đó là rất nhiều chi phí.

+0

Tôi muốn bắt đầu ở đây: http://www.koders.com/csharp/fidD8A53577DCD929265B6FE7D3B483FE38655DFDCF.aspx –

+0

@MauricioScheffer - Liên kết của bạn không xuất hiện để làm việc nữa. –

Trả lời

24

Chúc mừng, Lớp HttpListener trong Mono hoạt động mà không có nhiều vấn đề. Tôi nghĩ rằng sự khác biệt đáng kể nhất giữa việc sử dụng nó trong môi trường MS và môi trường Linux là cổng 80 không thể bị ràng buộc mà không có bảo mật root/su/sudo. Các cổng khác không có hạn chế này. Ví dụ: nếu bạn chỉ định tiền tố: http://localhost:1234/ thì HttpListener hoạt động như mong đợi. Tuy nhiên, nếu bạn thêm tiền tố http://localhost/, bạn sẽ mong đợi để nghe trên cổng 80, nó không hoạt động âm thầm. Nếu bạn cố gắng ràng buộc với cổng 80 (http://localhost:80/) thì bạn sẽ ném một ngoại lệ.Nếu bạn gọi ứng dụng của mình là siêu người dùng hoặc root, bạn có thể ràng buộc rõ ràng với cổng 80 (http://localhost:80/).
Tôi chưa khám phá phần còn lại của các thành viên HttpListener đủ chi tiết để đưa ra bất kỳ nhận xét hữu ích nào về hoạt động của nó trong môi trường Linux. Tuy nhiên, nếu có sự quan tâm, tôi sẽ tiếp tục đăng các quan sát của tôi.

chickenSandwich

+6

Bạn có thể 'sudo setcap 'cap_net_bind_service = + ep'/usr/local/bin/mono-sgen' để kích hoạt các cổng <1024 không có quyền superuser. Hãy chắc chắn kiểm tra nếu đường dẫn 'mono-sgen' là chính xác cho bạn trước khi chạy lệnh. –

+0

Nó làm việc OK cho tôi cho đến ngày hôm nay:/bây giờ tôi nhận được kết nối kéo dài trong bang fin_wait2 nhưng có lẽ nó không phải là nâng cấp mono liên quan –

2

Tôi không chắc chắn lý do tại sao bạn muốn nhìn sâu vào mui xe. Ngay cả ở phía Microsoft, các tài liệu về http.sys có thể không cung cấp cho bạn thông tin thực sự có giá trị nếu bạn đang sử dụng .NET Framework.

Để biết nếu có điều gì đó hoạt động tốt trên Mono, bạn luôn phải tải xuống hình ảnh VPC hoặc VPC và thử nghiệm các ứng dụng của bạn trên đó.

http://www.go-mono.com/mono-downloads/download.html

Mặc dù Mono là trưởng thành hơn một vài năm trước đây, chúng ta không thể nói rằng nó đã được thử nghiệm bởi đủ các ứng dụng thực tế như Microsoft.NET. Vì vậy, hãy kiểm tra các ứng dụng của bạn và gửi các vấn đề bạn tìm thấy cho nhóm Mono.

Dựa trên kinh nghiệm của tôi, các sự cố nhỏ được khắc phục trong vòng vài ngày, trong khi các vấn đề lớn phải mất nhiều thời gian hơn. Nhưng với mã nguồn Mono có sẵn, bạn có thể tự khắc phục hoặc tìm ra cách giải quyết tốt hầu hết thời gian.

+0

Rất cám ơn Lex. Tôi đã mong đợi phiên bản thư viện của Microsoft mở một ổ cắm nghe và thực hiện một số phân tích cú pháp tiêu đề. Tôi đã không mong đợi một mô-đun hạt nhân chạy trong vòng 0. Nếu phiên bản của Mono cũng sử dụng một mô-đun hạt nhân, nó sẽ thông báo bất kỳ quyết định kỹ thuật nào tôi cần thực hiện. – billpg

+0

Http.sys đầu tiên xuất hiện trong Windows Server 2003 để cải thiện hiệu suất và cung cấp các tính năng mới. Nhưng nó không thay đổi API HttpListener, phải không? HttpListener vẫn hoạt động trên Windows XP, nơi http.sys không tồn tại. Điều này cũng áp dụng cho Mono, nơi mà hệ điều hành bên dưới có thể hoặc có thể không có mô-đun giống như http.sys. Theo như tôi biết, trong trường hợp như vậy đội Mono cố gắng cung cấp nhiều phụ trợ và một trong số chúng sẽ được chọn trong thời gian chạy dựa trên OS/mô-đun mà nó phát hiện. Kiểm tra trường hợp tương tự này, "Các vấn đề với FileSystemWatcher là gì?" trong http://www.mono-project.com/FAQ:_Technical –

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