'-----------------------------------------------------------------------
' This file is part of the Microsoft .NET Framework SDK Code Samples.
'
' Copyright (C) Microsoft Corporation. All rights reserved.
'
'This source code is intended only as a supplement to Microsoft
'Development Tools and/or on-line documentation. See these other
'materials for detailed information regarding Microsoft code samples.
'
'THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY
'KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
'IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
'PARTICULAR PURPOSE.
'-----------------------------------------------------------------------
Imports System
Imports System.Net
Imports System.Threading
Imports System.Text
Imports System.IO
Namespace Microsoft.Samples.QuickStart.HowTo.Net.WebRequests
' The RequestState class is used to pass data
' across async calls
NotInheritable Class RequestState
Private requestDataValue As New StringBuilder("")
Private buffer(1024) As Byte
Private requestValue As HttpWebRequest
Private responseValue As HttpWebResponse
Private responseStreamValue As Stream
' Create Decoder for appropriate encoding type
Private decoderValue As Decoder = Encoding.UTF8.GetDecoder()
Property RequestData() As StringBuilder
Get
Return requestDataValue
End Get
Set(ByVal inputValue As StringBuilder)
requestDataValue = inputValue
End Set
End Property
Property ReadBuffer() As Byte()
Get
Return buffer
End Get
Set(ByVal inputValue As Byte())
buffer = inputValue
End Set
End Property
Property Request() As HttpWebRequest
Get
Return requestValue
End Get
Set(ByVal inputValue As HttpWebRequest)
requestValue = inputValue
End Set
End Property
Property Response() As HttpWebResponse
Get
Return responseValue
End Get
Set(ByVal value As HttpWebResponse)
responseValue = value
End Set
End Property
Property ResponseStream() As Stream
Get
Return responseStreamValue
End Get
Set(ByVal inputValue As Stream)
responseStreamValue = inputValue
End Set
End Property
Property DataDecoder() As Decoder
Get
Return decoderValue
End Get
Set(ByVal inputValue As Decoder)
decoderValue = inputValue
End Set
End Property
End Class
' ClientGetAsync issues the async request
NotInheritable Class ClientGetAsync
Private Shared allDone As New ManualResetEvent(False)
Private Const BUFFER_SIZE As Integer = 1024
Shared Sub Main()
Dim Args As String() = Environment.GetCommandLineArgs()
If Args.Length < 2 Then
ShowUsage()
Return
End If
' Get the URI from the command line
Dim uri As Uri = New Uri(Args(1))
' Create the request object
Dim request As HttpWebRequest = CType(WebRequest.Create(uri), HttpWebRequest)
' Create the state object
Dim state As RequestState = New RequestState()
' Add the request into the state so it can be passed around
state.Request = request
' Issue the async request
request.BeginGetResponse(New AsyncCallback(AddressOf RespCallback), state)
' Set the ManualResetEvent to Wait so that the app
' doesn't exit until after the callback is called
allDone.WaitOne()
End Sub
Private Shared Sub ShowUsage()
Console.WriteLine("Attempts to GET a URL")
Console.WriteLine()
Console.WriteLine("Usage:")
Console.WriteLine("ClientGetAsync URL")
Console.WriteLine("Examples:")
Console.WriteLine("ClientGetAsync http://www.microsoft.com/")
End Sub
Private Shared Sub RespCallback(ByVal result As IAsyncResult)
' Get the RequestState object from the async result
Dim state As RequestState = CType(result.AsyncState, RequestState)
' Get the HttpWebRequest from RequestState
Dim request As HttpWebRequest = state.Request
Dim response As HttpWebResponse = Nothing
Try
' Calling EndGetResponse produces the HttpWebResponse object
' which came from the request issued above
response = CType(request.EndGetResponse(result), HttpWebResponse)
' Add the response to the state object.
state.Response = response
' Now that we have the response, it is time to start reading
' data from the response stream
Dim ResponseStream As Stream = response.GetResponseStream()
' The read is also done using async so we'll want
' to store the stream in RequestState
state.ResponseStream = ResponseStream
' Note that rs.BufferRead is passed in to BeginRead. This is
' where the data will be read into.
ResponseStream.BeginRead( _
state.ReadBuffer, _
0, _
BUFFER_SIZE, _
New AsyncCallback(AddressOf ReadCallBack), _
state)
Catch exc As WebException
Console.WriteLine()
Console.WriteLine("The request URI was not found.")
If response IsNot Nothing Then
response.Close()
End If
allDone.Set()
Catch exc As IOException
Console.WriteLine()
Console.WriteLine("Could not connect to the requested resource.")
response.Close()
allDone.Set()
End Try
End Sub
Private Shared Sub ReadCallBack(ByVal result As IAsyncResult)
' Get the RequestState object from the asyncresult
Dim state As RequestState = CType(result.AsyncState, RequestState)
' Pull out the ResponseStream that was set in RespCallback
Dim responseStream As Stream = state.ResponseStream
' At this point rs.BufferRead should have some data in it.
' Read will tell us if there is any data there
Dim read As Integer = responseStream.EndRead(result)
If read > 0 Then
' Prepare Char array buffer for converting to Unicode
Dim charBuffer(1024) As Char
' Convert byte stream to Char array and then String
' len shows how many characters are converted to Unicode
Dim length As Integer = state.DataDecoder.GetChars(state.ReadBuffer, 0, read, charBuffer, 0)
' Append the recently read data to the RequestData stringbuilder object
' contained in RequestState
state.RequestData.Append(New String(charBuffer, 0, length))
' Now fire off another async call to read some more data
' Note that this will continue to get called until
' responseStream.EndRead returns 0.
Try
responseStream.BeginRead( _
state.ReadBuffer, _
0, _
BUFFER_SIZE, _
New AsyncCallback(AddressOf ReadCallBack), _
state)
Catch exc As IOException
Console.WriteLine()
Console.WriteLine("Could not retrieve the requested resource.")
state.Response.Close()
allDone.Set()
End Try
Else
' All of the data has been read, so display it to the console
Console.WriteLine(state.RequestData.ToString())
' Close down the response stream
responseStream.Close()
' Set the ManualResetEvent so the main thread can exit
allDone.Set()
End If
Return
End Sub
End Class
End Namespace
|