httpwebrequest异步获取处理GZIP压缩数据的问题

Hotus 2017-06-28 11:49:59
请教下httpwebrequest异步获取,如何处理GZIP压缩数据呢
下面的MSDN上的示例

Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Threading
Imports Microsoft.VisualBasic

Public Class RequestState
' This class stores the State of the request.
Private BUFFER_SIZE As Integer = 1024
Public requestData As StringBuilder
Public BufferRead() As Byte
Public request As HttpWebRequest
Public response As HttpWebResponse
Public streamResponse As Stream

Public Sub New()
BufferRead = New Byte(BUFFER_SIZE) {}
requestData = New StringBuilder("")
request = Nothing
streamResponse = Nothing
End Sub 'New
End Class 'RequestState


Class HttpWebRequest_BeginGetResponse

Public Shared allDone As New ManualResetEvent(False)
Private BUFFER_SIZE As Integer = 1024
Private DefaultTimeout As Integer = 2 * 60 * 1000

' 2 minutes timeout
' Abort the request if the timer fires.
Private Shared Sub TimeoutCallback(state As Object, timedOut As Boolean)
If timedOut Then
Dim request As HttpWebRequest = state

If Not (request Is Nothing) Then
request.Abort()
End If
End If
End Sub 'TimeoutCallback


Shared Sub Main()

Try
' Create a HttpWebrequest object to the desired URL.
Dim myHttpWebRequest As HttpWebRequest = WebRequest.Create("http://www.contoso.com")

' Create an instance of the RequestState and assign the previous myHttpWebRequest
' object to it's request field.

Dim myRequestState As New RequestState()
myRequestState.request = myHttpWebRequest

Dim myResponse As New HttpWebRequest_BeginGetResponse()

' Start the asynchronous request.
Dim result As IAsyncResult = CType(myHttpWebRequest.BeginGetResponse(New AsyncCallback(AddressOf RespCallback), myRequestState), IAsyncResult)

' this line implements the timeout, if there is a timeout, the callback fires and the request aborts.
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, New WaitOrTimerCallback(AddressOf TimeoutCallback), myHttpWebRequest, myResponse.DefaultTimeout, True)

' The response came in the allowed time. The work processing will happen in the
' callback function.
allDone.WaitOne()

' Release the HttpWebResponse resource.
myRequestState.response.Close()
Catch e As WebException
Console.WriteLine(ControlChars.Lf + "Main Exception raised!")
Console.WriteLine(ControlChars.Lf + "Message:{0}", e.Message)
Console.WriteLine(ControlChars.Lf + "Status:{0}", e.Status)
Console.WriteLine("Press any key to continue..........")
Catch e As Exception
Console.WriteLine(ControlChars.Lf + "Main Exception raised!")
Console.WriteLine("Source :{0} ", e.Source)
Console.WriteLine("Message :{0} ", e.Message)
Console.WriteLine("Press any key to continue..........")
Console.Read()
End Try
End Sub 'Main

Private Shared Sub RespCallback(asynchronousResult As IAsyncResult)
Try
' State of request is asynchronous.
Dim myRequestState As RequestState = CType(asynchronousResult.AsyncState, RequestState)
Dim myHttpWebRequest As HttpWebRequest = myRequestState.request
myRequestState.response = CType(myHttpWebRequest.EndGetResponse(asynchronousResult), HttpWebResponse)

' Read the response into a Stream object.
Dim responseStream As Stream = myRequestState.response.GetResponseStream()
myRequestState.streamResponse = responseStream

' Begin the Reading of the contents of the HTML page and print it to the console.
Dim asynchronousInputRead As IAsyncResult = responseStream.BeginRead(myRequestState.BufferRead, 0, 1024, New AsyncCallback(AddressOf ReadCallBack), myRequestState)
Return
Catch e As WebException
Console.WriteLine(ControlChars.Lf + "RespCallback Exception raised!")
Console.WriteLine(ControlChars.Lf + "Message:{0}", e.Message)
Console.WriteLine(ControlChars.Lf + "Status:{0}", e.Status)
End Try
allDone.Set()
End Sub 'RespCallback

Private Shared Sub ReadCallBack(asyncResult As IAsyncResult)
Try

Dim myRequestState As RequestState = CType(asyncResult.AsyncState, RequestState)
Dim responseStream As Stream = myRequestState.streamResponse
Dim read As Integer = responseStream.EndRead(asyncResult)
' Read the HTML page and then print it to the console.
If read > 0 Then
myRequestState.requestData.Append(Encoding.ASCII.GetString(myRequestState.BufferRead, 0, read))
Dim asynchronousResult As IAsyncResult = responseStream.BeginRead(myRequestState.BufferRead, 0, 1024, New AsyncCallback(AddressOf ReadCallBack), myRequestState)
Return
Else
Console.WriteLine(ControlChars.Lf + "The contents of the Html page are : ")
If myRequestState.requestData.Length > 1 Then
Dim stringContent As String
stringContent = myRequestState.requestData.ToString()
Console.WriteLine(stringContent)
End If
Console.WriteLine("Press any key to continue..........")
Console.ReadLine()

responseStream.Close()
End If

Catch e As WebException
Console.WriteLine(ControlChars.Lf + "ReadCallBack Exception raised!")
Console.WriteLine(ControlChars.Lf + "Message:{0}", e.Message)
Console.WriteLine(ControlChars.Lf + "Status:{0}", e.Status)
End Try
allDone.Set()
End Sub 'ReadCallBack
End Class 'HttpWebRequest_BeginGetResponse
...全文
200 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdashewan 2017-06-28
  • 打赏
  • 举报
回复
参照http://www.cnblogs.com/yunspider/p/3969784.html

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧