Есть ли другой способ легко сделать запрос POST в .NET, отличный от класса WebRequest? У меня есть очень, ОЧЕНЬ маленький кусочек данных, который мне нужно опубликовать:
пароль = theword
... но WebRequest случайно, а я имею в виду случайным образом, отбрасывает данные при публикации на моем сервере. Я проверил это, используя кусок кода с моего сервера, который выводит запрос на консоль, и я могу сказать, что клиент иногда отправляет, а иногда не отправляет данные POST.
Код, который я использую, который использует WebRequest, работает в другом проекте, когда общается с IIS. Обсуждаемый сервер (минимальный веб-сервер в другой системе) правильно реагирует каждый раз, когда я отправляю на него данные через Firefox. У меня есть функция в том же проекте, которая запускает запрос GET, и это работает. Просто кажется, что моя функция POST не завершает транзакцию ... то, что я заметил в прошлом, когда просил WebRequest обрабатывать небольшие строки.
Вот код, который мне подходит. Если какой-нибудь гуру .NET сможет указать мне на мою ошибку или предложить другой веб-клиент, я буду очень признателен. Спасибо!
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
---- UPDATE ---
Мне пришлось опускаться ниже, чтобы исправить это, но, к счастью, в прошлые времена я баловался с библиотеками сокетов .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