WebRequest クラス以外に .NET で POST 要求を簡単に作成する別の方法はありますか? 投稿する必要がある非常に小さなデータがあります。
パスワード=単語
...しかし、WebRequestはランダムに、つまりランダムに、サーバーに投稿するときにデータをドロップします。サーバーからリクエストをコンソールにダンプするコードのチャンクを使用してテストしましたが、クライアントが POST データを送信する場合と送信しない場合があることがわかりました。
私が使用している WebRequest を使用するコードは、IIS と通信するときに別のプロジェクトで動作します。通信しているサーバー (別のシステムの最小限の Web サーバー) は、Firefox を介してデータを POST するたびに適切に応答します。同じプロジェクトに 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