ネットワークでのストリームの使用
.NET Framework では、ネットワーク リソースはストリームとして表されます。.NET Framework では、ストリームを汎用的に扱うことによって、次の機能を実現します。
Web データを送受信するための共通の方法が提供されます。HTML や XML など、ファイルの実際の内容に関係なく、アプリケーションでは、データの送受信に Stream.Write および Stream.Read が使用されます。
.NET Framework 全体でストリームの互換性が確保されます。ストリームは、ストリームを処理するための豊富なインフラストラクチャが用意されている .NET Framework 全体で使用されます。たとえば、ストリームを初期化する数行のコードを変更するだけで、FileStream から XML データを読み取るアプリケーションを、NetworkStream からデータを読み取るように変更できます。NetworkStream クラスとそれ以外のストリームの主な相違点は、NetworkStream がシーク可能でないこと、CanSeek プロパティは常に false を返すこと、および Seek メソッドと Position メソッドが NotSupportedException をスローすることです。
データが到着すると、すぐに処理されます。ストリームでは、ネットワークからデータが到着するとすぐにアクセスできます。アプリケーションは、データセット全体がダウンロードされるまで待機する必要はありません。
System.Net.Sockets 名前空間には、ネットワーク リソースで使用するための Stream クラスを実装する NetworkStream クラスが含まれています。System.Net.Sockets 名前空間内のクラスは、NetworkStream クラスを使用してストリームを表します。
返されたストリームを使用してネットワークにデータを送信するには、WebRequest で GetRequestStream を呼び出します。WebRequest は、要求のヘッダーをサーバーに送信します。この後、返されたストリームで BeginWrite メソッド、EndWrite メソッド、または Write メソッドを呼び出して、ネットワーク リソースにデータを送信できます。HTTP などの一部のプロトコルでは、データを送信する前に、プロトコル固有のプロパティを設定する必要がある場合があります。データを送信するために HTTP 固有のプロパティを設定する方法を次のコード例に示します。この例では、変数 sendData
には送信するデータが、変数 sendLength
には送信するデータのバイト数が格納されることを前提としています。
HttpWebRequest request =
(HttpWebRequest) WebRequest.Create("https://www.contoso.com/");
request.Method = "POST";
request.ContentLength = sendLength;
try
{
Stream sendStream = request.GetRequestStream();
sendStream.Write(sendData,0,sendLength);
sendStream.Close();
}
catch
{
// Handle errors . . .
}
Dim request As HttpWebRequest = _
CType(WebRequest.Create("https://www.contoso.com/"), HttpWebRequest)
request.Method = "POST"
request.ContentLength = sendLength
Try
Dim sendStream As Stream = request.GetRequestStream()
sendStream.Write(sendData, 0, sendLength)
sendStream.Close()
Catch
' Handle errors . . .
End Try
ネットワークからデータを受信するには、WebResponse で GetResponseStream を呼び出します。次に、返されたストリームで BeginRead メソッド、EndRead メソッド、または Read メソッドを呼び出して、ネットワーク リソースからデータを読み取ることができます。
ネットワーク リソースからのストリームを使用するときは、次の点を念頭に置いてください。
CanSeek プロパティは常に false を返します。これは、NetworkStream クラスはストリーム内で位置を変更できないためです。Seek メソッドと Position メソッドは NotSupportedException をスローします。
WebRequest と WebResponse を使用する場合、GetResponseStream の呼び出しで作成されるストリーム インスタンスは読み取り専用であり、GetRequestStream の呼び出しで作成されるストリーム インスタンスは書き込み専用です。
エンコードを簡単にするには、StreamReader クラスを使用します。次に示すコード例では、StreamReader を使用して、ASCII エンコードされたストリームを WebResponse から読み取ります。この例では、要求を作成するコードは示しません。
ネットワーク リソースが使用できない場合、GetResponse の呼び出しがブロックされることがあります。BeginGetResponse メソッドと EndGetResponse メソッドによる非同期要求の使用を考慮してください。
サーバーへの接続が作成されている間、GetRequestStream の呼び出しがブロックされることがあります。BeginGetRequestStream メソッドと EndGetRequestStream メソッドによるストリームの非同期要求の使用を考慮してください。
// Create a response object.
WebResponse response = request.GetResponse();
// Get a readable stream from the server.
StreamReader sr =
new StreamReader(response.GetResponseStream(), Encoding.ASCII);
// Use the stream. Remember when you are through with the stream to close it.
sr.Close();
' Create a response object.
Dim response As WebResponse = request.GetResponse()
' Get a readable stream from the server.
Dim sr As _
New StreamReader(response.GetResponseStream(), Encoding.ASCII)
' Use the stream. Remember when you are through with the stream to close it.
sr.Close()
参照
処理手順
方法 : WebRequest クラスを使用してデータを要求する