16,721
社区成员




Private Shared Function Request(ByVal url As String, ByVal method As String, ByVal Optional data As String = Nothing, ByVal Optional contentType As String = Nothing, ByVal Optional certPath As String = Nothing, ByVal Optional certPassword As String = Nothing, ByVal Optional cookies As CookieContainer = Nothing) As String
Try
If url.StartsWith("https", StringComparison.OrdinalIgnoreCase) Then
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(CheckValidationResult)
End If
Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
req.Method = method
If Not String.IsNullOrEmpty(contentType) Then req.ContentType = contentType
If Not String.IsNullOrEmpty(certPath) Then
Dim cert As X509Certificate2 = New X509Certificate2(certPath, If(certPassword, ""), X509KeyStorageFlags.MachineKeySet)
req.ClientCertificates.Add(cert)
End If
If data IsNot Nothing AndAlso method = "POST" Then
Dim btyData As Byte() = System.Text.Encoding.UTF8.GetBytes(data)
req.ContentLength = btyData.Length
Dim reqStream As Stream = req.GetRequestStream()
reqStream.Write(btyData, 0, btyData.Length)
reqStream.Close()
End If
Using res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
Using sr As StreamReader = New StreamReader(res.GetResponseStream(), Encoding.UTF8)
Return sr.ReadToEnd()
End Using
End Using
Catch e As WebException
End Try
End Function
Imports System.Collections.Generic
Imports System.Collections
Imports System.Web
Imports System.IO
Imports System.Security.Cryptography
Imports System.Xml
Imports System.Text.RegularExpressions
Imports System.Globalization
Imports System.IO.Compression
Imports System.Net
Imports System.Text
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Reflection
Imports System.Collections.Specialized
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates
'
''' <summary>
''' HttpWeb请求管理。
''' </summary>
Public Class MyHttpWebRequest
'
''' <summary>
''' 保存网站Cookie。
''' </summary>
Private m_cookieheader As String
''' <summary>
''' 保存引用地址
''' </summary>
Private m_Referer As String = String.Empty
Private m_Status As HttpStatusCode = HttpStatusCode.OK
'
''' <summary>
''' 页面请求超时限制。
''' </summary>
Private TIMEOUT As Integer = 60000
''' <summary>
''' 设置引用URL
''' </summary>
''' <param name="url"></param>
Public Sub SetReferer(ByVal url As String)
m_Referer = url
End Sub
''' <summary>
''' 设置最长连接时间
''' </summary>
''' <param name="seconds">秒</param>
Public Sub SetTimeOut(ByVal seconds As Integer)
TIMEOUT = seconds * 1000
End Sub
''' <summary>
''' 设置引用URL
''' </summary>
''' <param name="url"></param>
Public ReadOnly Property GetStatusCode() As HttpStatusCode
Get
Return m_Status
End Get
End Property
Public Sub New()
'
' 构造函数逻辑
'
Me.m_cookieheader = ""
End Sub
'
''' <summary>
''' 断开,清除Cookie。
''' </summary>
Public Sub Disconnect()
Me.m_cookieheader = ""
End Sub
'
''' <summary>
''' 登录,记录会话。
''' </summary>
Public Function Login(ByVal url As [String], ByVal paramList As NameValueCollection, ByVal wideCharEncoding As System.Text.Encoding) As String
Return getPage(url, paramList, wideCharEncoding, "POST", True)
End Function
'
''' <summary>
''' Form提交方式获取响应数据。
''' </summary>
Public Function post(ByVal url As [String], ByVal paramList As NameValueCollection, ByVal wideCharEncoding As System.Text.Encoding) As String
Return getPage(url, paramList, wideCharEncoding, "POST", False)
End Function
'
''' <summary>
''' Get方式获取响应数据。
''' </summary>
Public Function getPage(ByVal url As [String]) As String
Return getPage(url, Nothing, Nothing, "GET", False)
End Function
'
''' <summary>
''' Get方式获取响应数据。
''' </summary>
Public Function getPageData(ByVal url As [String], ByVal doSetCookie As Boolean) As Byte()
Return getPageBytes(url, Nothing, Nothing, "GET", doSetCookie)
End Function
Private Function getPage(ByVal url As [String], ByVal paramList As NameValueCollection, ByVal wideCharEncoding As System.Text.Encoding, ByVal method As String, ByVal doSetCookie As Boolean) As String
Return System.Text.Encoding.UTF8.GetString(getPageBytes(url, paramList, wideCharEncoding, method, doSetCookie))
End Function
Private Shared Function CheckValidationResult(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal errors As SslPolicyErrors) As Boolean
Return True '总是接受
End Function
Private Function getPageBytes(ByVal url As [String], ByVal paramList As NameValueCollection, ByVal wideCharEncoding As System.Text.Encoding, ByVal method As String, ByVal resetCookie As Boolean) As Byte()
Dim res As HttpWebResponse = Nothing
Dim result As New System.Collections.ArrayList(5000)
Try
Dim req As HttpWebRequest = Nothing
'如果是发送HTTPS请求
If url.StartsWith("https", StringComparison.OrdinalIgnoreCase) Then
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf CheckValidationResult)
ServicePointManager.SecurityProtocol = CType(&HC0 Or &H300 Or &HC00, SecurityProtocolType)
req = TryCast(WebRequest.Create(url), HttpWebRequest)
req.ProtocolVersion = HttpVersion.Version10
Else
req = TryCast(WebRequest.Create(url), HttpWebRequest)
End If
req.AllowAutoRedirect = False
req.Method = method
req.Timeout = TIMEOUT
'上行方式时,设置参数
If method.ToUpper() <> "GET" Then
Dim UrlEncoded As New StringBuilder()
Dim reserved As [Char]() = {"?"c, "="c, "&"c}
Dim SomeBytes As Byte() = Nothing
If paramList IsNot Nothing Then
Dim paramBuilder As New System.Text.StringBuilder()
Dim paramstr As [String] = Nothing
For li As Integer = 0 To paramList.Keys.Count - 1
If li > 0 Then
paramBuilder.Append("&")
End If
If paramList.Keys(li) <> "" Then
paramBuilder.Append(paramList.Keys(li))
paramBuilder.Append("=")
End If
paramBuilder.Append(paramList(paramList.Keys(li)))
Next
paramstr = paramBuilder.ToString()
SomeBytes = Encoding.UTF8.GetBytes(paramstr)
req.ContentLength = SomeBytes.Length
Dim newStream As Stream = req.GetRequestStream()
newStream.Write(SomeBytes, 0, SomeBytes.Length)
newStream.Close()
Else
req.ContentLength = 0
End If
End If
'请求响应
res = DirectCast(req.GetResponse(), HttpWebResponse)
m_Status = res.StatusCode
If resetCookie Then
Me.m_cookieheader = req.CookieContainer.GetCookieHeader(New Uri(url))
End If
Dim ReceiveStream As Stream = res.GetResponseStream()
Dim sr As System.IO.BinaryReader = Nothing
If res.ContentEncoding = "gzip" Then
Dim stream As New GZipStream(ReceiveStream, CompressionMode.Decompress)
sr = New BinaryReader(stream)
Else
sr = New BinaryReader(ReceiveStream)
End If
'读取数据
Dim read As Byte() = New Byte(255) {}
Dim count As Integer = sr.Read(read, 0, 256)
While count > 0
result.AddRange(GetSubBytes(read, 0, count))
count = sr.Read(read, 0, 256)
End While
Catch ex As Exception
Dim tmp As String = ex.Message
result.Clear()
Finally
If res IsNot Nothing Then
res.Close()
End If
End Try
Return DirectCast(result.ToArray(GetType(Byte)), Byte())
End Function
Private Function GetSubBytes(ByVal buffer As Byte(), ByVal index As Integer, ByVal count As Integer) As Byte()
If (count + index) > buffer.Length Then
count = buffer.Length - index
End If
Dim s As New System.IO.MemoryStream(buffer, index, count)
Return s.ToArray()
End Function
End Class
Public static string Request(string url, string method, string data = null, string contentType = null, string certPath = null, string certPassword = null, CookieContainer cookies = null)
{
try
{
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
}
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = method;
if (!String.IsNullOrEmpty(contentType)) req.ContentType = contentType;
if (!string.IsNullOrEmpty(certPath))
{
X509Certificate2 cert = new X509Certificate2(certPath, certPassword ?? "", X509KeyStorageFlags.MachineKeySet);
req.ClientCertificates.Add(cert);
}
if (data != null && method == "POST")
{
byte[] btyData = System.Text.Encoding.UTF8.GetBytes(data);
req.ContentLength = btyData.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(btyData, 0, btyData.Length);
reqStream.Close();
}
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8))
{
return sr.ReadToEnd();
}
}
}
catch (WebException e)
{
}
}
Private Function getPageBytes(ByVal url As [String], ByVal paramList As NameValueCollection, ByVal wideCharEncoding As System.Text.Encoding, ByVal method As String, ByVal resetCookie As Boolean) As Byte()
Dim res As HttpWebResponse = Nothing
Dim result As New System.Collections.ArrayList(5000)
Try
Dim req As HttpWebRequest = Nothing
'如果是发送HTTPS请求
If url.StartsWith("https", StringComparison.OrdinalIgnoreCase) Then
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf CheckValidationResult)
ServicePointManager.SecurityProtocol = CType(&HC0 Or &H300 Or &HC00, SecurityProtocolType)
req = TryCast(WebRequest.Create(url), HttpWebRequest)
req.ProtocolVersion = HttpVersion.Version10
Else
req = TryCast(WebRequest.Create(url), HttpWebRequest)
End If
req.AllowAutoRedirect = False
req.Method = method
req.Timeout = TIMEOUT
'上行方式时,设置参数
If method.ToUpper() <> "GET" Then
Dim UrlEncoded As New StringBuilder()
Dim reserved As [Char]() = {"?"c, "="c, "&"c}
Dim SomeBytes As Byte() = Nothing
If paramList IsNot Nothing Then
Dim paramBuilder As New System.Text.StringBuilder()
Dim paramstr As [String] = Nothing
For li As Integer = 0 To paramList.Keys.Count - 1
If li > 0 Then
paramBuilder.Append("&")
End If
If paramList.Keys(li) <> "" Then
paramBuilder.Append(paramList.Keys(li))
paramBuilder.Append("=")
End If
paramBuilder.Append(paramList(paramList.Keys(li)))
Next
paramstr = paramBuilder.ToString()
SomeBytes = Encoding.UTF8.GetBytes(paramstr)
req.ContentLength = SomeBytes.Length
Dim newStream As Stream = req.GetRequestStream()
newStream.Write(SomeBytes, 0, SomeBytes.Length)
newStream.Close()
Else
req.ContentLength = 0
End If
End If
'请求响应
res = DirectCast(req.GetResponse(), HttpWebResponse)
m_Status = res.StatusCode
If resetCookie Then
Me.m_cookieheader = req.CookieContainer.GetCookieHeader(New Uri(url))
End If
Dim ReceiveStream As Stream = res.GetResponseStream()
Dim sr As System.IO.BinaryReader = Nothing
If res.ContentEncoding = "gzip" Then
Dim stream As New GZipStream(ReceiveStream, CompressionMode.Decompress)
sr = New BinaryReader(stream)
Else
sr = New BinaryReader(ReceiveStream)
End If
'读取数据
Dim read As Byte() = New Byte(255) {}
Dim count As Integer = sr.Read(read, 0, 256)
While count > 0
result.AddRange(GetSubBytes(read, 0, count))
count = sr.Read(read, 0, 256)
End While
Catch ex As Exception
Dim tmp As String = ex.Message
result.Clear()
Finally
If res IsNot Nothing Then
res.Close()
End If
End Try
Return DirectCast(result.ToArray(GetType(Byte)), Byte())
End Function