プラグ可能なプロトコルの概要
Microsoft .NET Framework には、アプリケーションにすばやく簡単に統合できる、複数層の、拡張可能なインターネット サービスのマネージ実装が用意されています。System.Net 名前空間および System.Net.Sockets 名前空間のインターネット アクセス クラスを使用すると、Web ベースのアプリケーションおよびインターネット ベースのアプリケーションの両方を実装できます。
インターネット アプリケーション
インターネット アプリケーションは、大きく 2 つに分類できます。1 つは、情報を要求するクライアント アプリケーションで、もう 1 つは、クライアントからの情報要求に応答するサーバー アプリケーションです。典型的なインターネット クライアント サーバー アプリケーションは WWW (World Wide Web) で、ブラウザを使用して世界中の Web サーバーに格納されているドキュメントやその他のデータにアクセスできます。
アプリケーションは、クライアントまたはサーバーのいずれかにその役割が限定されるとは限りません。たとえば、使いやすい中間層のアプリケーション サーバーが、別のサーバーのデータを要求することによって、クライアントからの要求に応答する場合があります。その場合、そのアプリケーションは、サーバーとクライアントの両方の役割を果たします。
クライアント アプリケーションでは、要求されたインターネット リソースと、要求と応答のために使用する通信プロトコルを識別することで要求が作成されます。必要に応じて、要求を完成するのに必要なプロキシの場所や認証情報 (ユーザー名、パスワードなど) などの追加データも提供されます。作成された要求は、サーバーに送信することができます。
リソースの識別
.NET Framework では、URI (Uniform Resource Identifier) を使用して、要求されたインターネット リソースおよび通信プロトコルが識別されます。URI は、少なくとも 3 つ、または 4 つの部分で構成されます。つまり、要求および応答のための通信プロトコルを識別するスキーム ID、DNS (ドメイン ネーム システム) のホスト名または TCP アドレス (インターネット上のサーバーを一意に識別するアドレス) のいずれかで構成されるサーバー ID、要求された情報のサーバー上の場所を特定するパス ID、およびクライアントからサーバーに情報を渡すクエリ文字列 (省略可能) で構成されます。たとえば、URI "https://www.contoso.com/whatsnew.aspx?date=today" は、スキーム ID "http"、サーバー ID "www.contoso.com"、パス "/whatsnew.aspx"、およびクエリ文字列 "?date=today" で構成されています。
サーバーは要求を受け取り、応答を処理した後で、その応答をクライアント アプリケーションに返します。応答には、コンテンツの種類 (未加工テキストか XML データか) などの補足情報が追加されます。
.NET Framework における要求と応答
.NET Framework では、要求/応答モデルを介したインターネット リソースへのアクセスに必要な 3 つの情報が、3 つの特定のクラスによって提供されます。これらのクラスとは、シーク中のインターネット リソースの URI が含まれている Uri クラス、リソース要求が含まれている WebRequest クラス、および着信応答のためのコンテナを用意する WebResponse クラスです。
クライアント アプリケーションは、ネットワーク リソースの URI を Create メソッドに渡して WebRequest のインスタンスを作成します。この静的メソッドは、HTTP などの特定のプロトコルに対する WebRequest を作成します。WebRequest が返されると、サーバーに対する要求と、要求時に送信されるデータ ストリームへのアクセスの両方を制御するプロパティにアクセスできるようになります。クライアント アプリケーションからの要求は、WebRequest の GetResponse メソッドによって、URI で識別されるサーバーに送信されます。応答を遅延させる場合は、WebRequest の BeginGetResponse メソッドを使用して、非同期で要求を送信できます。また、応答は、後で EndGetResponse メソッドを使用して返すことができます。
GetResponse メソッドおよび EndGetResponse メソッドは、サーバーから返されたデータへのアクセスを提供する WebResponse を返します。このデータは、GetResponseStream メソッドによって要求元のアプリケーションにストリームとして提供されるため、データ ストリームを使用している任意のアプリケーションで使用できます。
WebRequest クラスおよび WebResponse クラスは、プラグ可能なプロトコル (各リソースが使用するプロトコルに固有の細部を気にせずに、インターネット リソースを使用するアプリケーションを開発できるネットワーク サービスの実装) のベースです。インターネット リソースへの実際の接続の詳細を管理するために、WebRequest の派生クラスが WebRequest クラスに登録されます。
たとえば、HttpWebRequest クラスは、HTTP を使用するインターネット リソースへの接続の詳細を管理します。既定では、WebRequest.Create メソッドが "http:" または "https:" (HTTP またはセキュリティで保護された HTTP のプロトコル ID) で始まる URI を検出したとき、返された WebRequest をそのまま使用するか、またはプロトコル固有のプロパティにアクセスするために HttpWebRequest に型キャストできます。ほとんどの場合、要求の実行に必要な情報はすべて、WebRequest によって提供されます。
WebRequest では、要求/応答トランザクションとして表現できる任意のプロトコルを使用できます。WebRequest および WebResponse からプロトコル固有のクラスを派生させ、アプリケーションで使用できるように、それを静的メソッド WebRequest.RegisterPrefix に登録します。
インターネットに対する要求のためにクライアント認証が必要なときは、WebRequest の Credentials プロパティで必要な資格情報を提供します。これらの資格情報は、基本 HTTP の名前とパスワードの単純なペア (ダイジェスト認証) か、または NTLM に設定された名前とパスワードとドメインのセット (Kerberos 認証) です。NetworkCredentials インスタンスには 1 つの資格情報セットを格納できます。また、CredentialCache インスタンスには複数の資格情報セットを同時に格納できます。CredentialCache は、要求の URI と、サーバーがサポートしている認証方式を使用して、どの資格情報をサーバーに送信するかを決定します。
WebClient を使用した単純な要求
インターネット リソースに対する単純な要求を行うアプリケーションには、WebClient クラスを使用して、データをインターネット サーバーにアップロードしたり、データをインターネット サーバーからダウンロードしたりするための共通のメソッドが用意されています。WebClient クラスは、WebRequest クラスに依存してインターネット リソースへのアクセスを可能にするため、登録されているプラグ可能な任意のプロトコルを使用できます。
要求/応答モデルを使用できないアプリケーションや、ネットワーク上でリッスンすると同時に、要求を送信する必要があるアプリケーションでは、System.Net.Sockets 名前空間の TCPClient、TCPListener、UDPClient の各クラスを使用します。これらのクラスは、さまざまなトランスポート プロトコルを使用して接続のための詳細を処理し、ネットワーク接続をストリームとしてアプリケーションに公開します。
Windows Sockets インターフェイスの知識のある開発者、またはソケット レベルのプログラミングで提供されるコントロールを必要とする開発者は、System.Net.Sockets 名前空間のクラスを使用することでその要件を満たすことができます。System.Net.Sockets 名前空間のクラスは、System.Net クラス内のマネージ コードからネイティブ コードへの遷移ポイントです。ほとんどの場合、System.Net.Sockets 名前空間のクラスは、データを Windows 32 ビット対応のデータにマーシャリングし、同時に必要なすべてのセキュリティ チェックを処理します。