2

最終的に、.NET WebBrowser コントロールでダウンロードをブロックし、HTML、画像、スクリプトなどの表示に効果的に制限したいのですが、ユーザーに「名前を付けて保存」ダイアログを表示することは決してありません。

その質問への回答で提案された解決策は、応答をチェックし、ダウンロード プロンプトにつながるものを除外するカスタム プロキシ サーバーを接続することでした。このようなプロキシを .NET アプリケーションに実装するにはどうすればよいですか? サードパーティのソフトウェアやライブラリをインストールしたくありません。

HttpListener クラスを見つけましたが、2 つの問題があります。

  1. リスナーには、それをトリガーする定義済みの一連のプレフィックスが必要です。ただし、アプリケーションにホスト名やポート番号をハードコーディングせず、一般的なものにしておくことを好みます。
  2. 実際のリクエストを自分で実行するコードを実装する必要があります-これを実行して、単に行をタップして、応答の内容を調べ、必要に応じて変更できるものはありませんか( J2EE はサーバー側で行います)?

アップデート

わかりました、これを明確にする必要があると思います: 私の .NET (リッチ クライアント) アプリケーションは、Web ベースのアプリケーションも含む複数のプロジェクトで使用されています。.NET アプリケーションには、WebBrowser コントロールを備えた再利用可能な汎用フォームが含まれています。他の開発者は、そのフォームを使用して、Web アプリケーションへのアクセスを .NET アプリケーションに統合します。

ダウンロードをブロックしたいので、WebBrowser フォームにすべてのトラフィックをインターセプトさせ、[名前を付けて保存] ダイアログが表示されないようにしたいと考えています。したがって...

  • ホスト名がどうなるかわからない
  • WebBrowser は実際の URL を指し、ユーザーは通常のリンクをクリックし、JavaScript をトリガーします... すべて Web アプリケーションによって提供されます。
  • WebBrowser が localhost を指している場合 (提案どおり)、応答を解析し、すべてのリンクを書き直して、元の URL を保持したまま、再び localhost を指すようにする必要があります。そんな面倒なことはしたくない。
4

2 に答える 2

5

HttpListenerうまくいくはずですが、これは http.sys の単なるラッパーであり、このライブラリは Windows XP 以降でのみ使用できます。

HttpPrefixes

http://127.0.0.1:8080/プレフィックスはローカル Web コントロール専用であるため、1 つだけ必要です。または、ワイルドカードがサポートさhttp://*:8080/れていますが、あなたのケースでそれを使用する理由はありません.

イェンス・バンマンは次のように書いています。

アクセスされるアプリケーションはオンではなくlocalhost、どこにでもある可能性があります。そのため、何もハードコーディングしたくありません。

アプリケーションとはどういう意味ですか? ウェブサイトのことですか?これはまったく別のものです。特別なプロキシ サーバーは HttpListenerRequests をリッスンするためhttp://127.0.0.1:8080/、Web コントロールはプロキシ サーバーを使用する必要がありますhttp://127.0.0.1:8080/。この時点ではまだすべてローカル マシン内にあります。

HttpListenerRequest/Response と HttpWebRequest/Response 間の変換

各着信HttpListenerRequestを に変換し、応答を要求すると、オブジェクトHttpWebRequestを取得HttpWebResponseし、WebBrowser コントロールの応答が許可されているかどうかを分析し、許可されている場合はHttpListnererResponseオブジェクトに書き込み、そうでない場合は別のもの (エラー ステータス) に書き込みます。

これはおそらく、.NET 上に独自のプロキシ サーバーを構築する最も簡単な方法です。

イェンス・バンマンは次のように書いています。

そうです、この変換は私がしなければならないことを避けたかったことでした. それとも、ほんの数行のコードでそれを行うことができますか? API を見ると、より複雑に見えます。

http プロトコルは自明なので、実際には非常に簡単です。基本的に3つの部分があります。

  • リクエスト行 (URL、http メソッド、および http バージョンが含まれます)
  • ヘッダー (実際には、API が非常に巨大で重要に見えるのはこのためですが、実際には、これらのプロパティとメソッドはすべて生の http ヘッダー上の薄いレイヤーにすぎません。必要なことは、すべてのヘッダーを一般的な方法で からに直接コピーすることだけです。どちらのクラスもraw アクセス用の汎用Headersプロパティ)HttpListenerRequestHttpWebRequest
  • メッセージ本文(内容があればコピペ)

変換全体は次のようになります。

HttpListenerRequest listenerRequest;

WebRequest webRequest = WebRequest.Create(listenerRequest.Url);
webRequest.Method = listenerRequest.HttpMethod;
webRequest.Headers.Add(listenerRequest.Headers);
byte[] body = new byte[listenerRequest.InputStream.Length];
listenerRequest.InputStream.Read(body, 0, body.Length);
webRequest.GetRequestStream().Write(body, 0, body.Length);

WebResponse webResponse = webRequest.GetResponse();

http プロトコルについてさらに支援が必要な場合は、このウィキペディアの記事 を参照してください

別の方法については、このオープン ソース プロジェクトを確認することもできます。クラスに依存しませんHttpListenerが、完全なプロキシ サーバー ソリューションであり、必要に応じて簡単に変更できるはずです。

于 2009-02-03T11:39:57.703 に答える
0

おそらくオープンソースのプロキシですか?

http://www.mentalis.org/soft/projects/proxy/

于 2009-02-03T13:17:20.377 に答える