除了 WebRequest 类之外,还有其他方法可以轻松地在 .NET 中发出 POST 请求吗?我有一个非常非常小的数据需要发布:
密码=密码
...但是 WebRequest 随机,我的意思是随机,在发布到我的服务器时丢弃数据。我已经通过使用我的服务器中将请求转储到控制台的一段代码对其进行了测试,我可以发现客户端有时会发送,有时不会发送 POST 数据。
在与 IIS 对话时,我使用的使用 WebRequest 的代码在另一个项目中工作。每次我通过 Firefox 向其发送数据时,与之交谈的服务器(另一个系统中的最小 Web 服务器)都会正确响应。我在同一个项目中有一个函数可以触发 GET 请求,并且可以正常工作。似乎我的 POST 函数没有完成交易......我过去在要求 WebRequest 处理小字符串时注意到的事情。
这是给我适合的代码。如果有任何 .NET 专家可以指出我的错误或建议另一个 Web 客户端,我将不胜感激。谢谢!
Private Function PostRequest(ByVal url As String, ByVal data As String) As String
Return ControlFunctions.PostRequest(url, data, 0)
End Function
Private Function PostRequest(ByVal url As String, ByVal data As String, ByVal times As Integer) As String
Dim req As HttpWebRequest = WebRequest.Create(url)
Dim retval As String = ""
req.Method = "POST"
req.UserAgent = "TSControl"
req.ContentType = "application/x-www-form-urlencoded"
req.ContentLength = data.Length
req.Headers.Add("Keep-Alive", "300")
req.KeepAlive = True
req.Timeout = 5000
Try
Dim DataStream As StreamWriter = New StreamWriter(req.GetRequestStream())
DataStream.AutoFlush = True
DataStream.Write(data)
DataStream.Close()
Dim sr As StreamReader = New StreamReader(req.GetResponse().GetResponseStream())
retval = sr.ReadToEnd()
sr.Close()
Catch x As Exception
If times < 5 Then
Threading.Thread.Sleep(1000)
times = times + 1
ControlFunctions.PostRequest(url, data, times)
Else
ErrorMsg.Show("Could not post to server" + vbCrLf + x.Message + vbCrLf + x.StackTrace)
End If
End Try
Return retval
End Function
- - 更新 - -
我不得不降低它来修复它,但幸运的是我过去曾涉足过 .NET 的套接字库:
Private Function PostRequest(ByVal url As String, ByVal data As String) As String
Dim uri As New Uri(url)
Dim read(16) As Byte
Dim FullTime As New StringBuilder
Dim PostReq As New StringBuilder
Dim WebConn As New TcpClient
PostReq.Append("POST ").Append(uri.PathAndQuery).Append(" HTTP/1.1").Append(vbCrLf)
PostReq.Append("User-Agent: TSControl").Append(vbCrLf)
PostReq.Append("Content-Type: application/x-www-form-urlencoded").Append(vbCrLf)
PostReq.Append("Content-Length: ").Append(data.Length.ToString).Append(vbCrLf)
PostReq.Append("Host: ").Append(uri.Host).Append(vbCrLf).Append(vbCrLf)
PostReq.Append(data)
WebConn.Connect(uri.Host, uri.Port)
Dim WebStream As NetworkStream = WebConn.GetStream()
Dim WebWrite As New StreamWriter(WebStream)
WebWrite.Write(PostReq.ToString)
WebWrite.Flush()
Dim bytes As Integer = WebStream.Read(read, 0, read.Length)
While bytes > 0
FullTime.Append(Encoding.UTF8.GetString(read))
read.Clear(read, 0, read.Length)
bytes = WebStream.Read(read, 0, read.Length)
End While
' Closes all the connections
WebWrite.Close()
WebStream.Close()
WebConn.Close()
Dim temp As String = FullTime.ToString()
If Not temp.Length <= 0 Then
Return temp
Else
Return "No page"
End If
End Function