IWebProxy policy = WebRequest.GetSystemWebProxy();
request.Proxy = policy;

返されたオブジェクトは IWebProxy のまま保持します。この断片は既存の WebRequest ベースのコードを対象としたもので、その旧式 API を新しいアプリケーションで採用することを勧めるものではありません。

WebProxy はこのインターフェイスを実装しますが、インターフェイスを実装するすべてのオブジェクトが WebProxy を継承しているわけではありません。そのためシステム ラッパーは、ネットワーク要求が起きる前にキャストを拒否することがあります。WebProxyWrapperOpaque のような .NET Framework の非公開クラス名は実装の詳細であり、プロキシのエンドポイントやアカウントの問題ではありません。

経路の判断には、実際の宛先 URI を渡して IsBypassed(destination) と GetProxy(destination) を呼び出します。バイパスはその宛先自体を返すことがあり、PAC ベースのポリシーは別のホストに対して別の経路を選ぶことがあります。

認証については、IWebProxy がすでに Credentials を公開しています。プロパティに到達するためにキャストせず、サポートされているアカウントと方法を使ってください。

単一の URI を取り出して代替の WebProxy を組み立てると、元のポリシーが宛先ごとに行う判断が失われます。固定のエンドポイントが意図したアプリケーション構成である場合にのみ行い、型エラーの回避策として使わないでください。

関連記事