HttpListener は Mono でうまく動作しますか?
-
05-10-2019 - |
質問
小さな Linux ボックスで実行する小さな Web サービスを作成しようとしています。私は C# でコーディングすることを好むので、Mono の使用を検討しています。
完全な Web サーバーまたは Mono バージョンの ASP.NET を実行するオーバーヘッドは望ましくありません。各クライアント接続を処理するスレッドを持つ単一のプロセスを考えています。データベースの代わりにスレッド間でメモリを共有します。
Microsoft のバージョンの HttpListener と、それが Http.sys ドライバーとどのように連携するかについて少し読んだことがあります。残念ながら、このクラスに関する Mono のドキュメントは自動化されたクラス インターフェイスに過ぎず、内部でどのように動作するかについては説明されていません。(Linux には Http.sys がないので、実質的に異なる方法で実装されていると思います。)
誰かがこのモジュールについて説明しているリソースを教えてもらえますか?
どうもありがとう、ビル、billpg.com
(興味のある方のために、私の質問の背景を少し説明します。)
少し前に、私は尋ねました この質問, 、何度もやり取りをしながら長い会話を続けることに興味があります。私は独自のアドホック プロトコルを設計することに落ち着いていましたが、私が話をした人たちは、「わかりました、今すぐコマンドを送信してください」という信号を犠牲にしても、REST インターフェイスを本当に望んでいたのです。
そこで、Linux/Mono サーバー上で ASP.NET を実行することを考えていましたが、HttpListener に出会いました。それぞれの「会話」を別個のスレッドで実行できるため、これは理想的であるように思えました。ループ内で HttpListener を呼び出すスレッドは、各受信接続がどのスレッドに対するものであるかを検索し、そのスレッドに参照を渡すことができます。
ASP.NET 主導のサービスの代替方法は、ASPX コードでデータベースから状態を取得し、終了時に新しい状態を書き戻すことです。はい、それは機能しますが、オーバーヘッドが大きくなります。
解決
挨拶、モノラルのhttplistenerクラスは、それほど問題なく動作します。MS 環境での使用と Linux 環境での使用の最も大きな違いは、root/su/sudo セキュリティがなければポート 80 にバインドできないことだと思います。他のポートにはこの制限はありません。たとえば、接頭辞を指定すると、次のようになります。 http://localhost:1234/
HttpListener は期待どおりに機能します。ただし、接頭辞を追加すると、 http://localhost/
, ポート 80 でリッスンすることが予想されますが、何も通知せずに失敗します。明示的にポート 80 にバインドしようとすると (http://ローカルホスト:80/)その後、例外をスローします。アプリケーションをスーパー ユーザーまたは root として起動すると、ポート 80 に明示的にバインドできます (http://ローカルホスト:80/).
残りの HttpListener メンバーについては、まだ Linux 環境でどのように適切に動作するかについて有益なコメントをできるほど詳しく調べていません。ただし、興味があれば、引き続き私の観察を投稿します。
チキンサンド
他のヒント
なぜそこまでボンネットを覗き込みたいのかわかりません。Microsoft 側でも、.NET Framework を使用している場合、http.sys に関するドキュメントは実際に貴重な情報を提供しない可能性があります。
Mono で何かが十分に動作するかどうかを確認するには、常にその VMware または VPC イメージをダウンロードし、その上でアプリケーションをテストする必要があります。
http://www.go-mono.com/mono-downloads/download.html
Mono は数年前に比べてはるかに成熟していますが、Microsoft.NET のような現実世界のアプリケーションで十分にテストされているとは言えません。したがって、アプリケーションをテストして、見つかった問題を Mono チームに送信してください。
私の経験によると、軽微な問題はわずか数日で修正されますが、重大な問題の場合はさらに時間がかかります。しかし、Mono のソース コードが利用可能であれば、ほとんどの場合、自分で修正したり、適切な回避策を見つけたりすることができます。