0

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
4

2 に答える 2

2

「まとまった」応答を受け取った場合はどうなりますか? どのようにデコードしますか?

それが私が今日一日中苦労してきたことです。通常の Web サービスを扱っていればそれほど苦労することはありませんが、eBay の API データを読み取るアプリケーションを作成しており、eBay が間違ったチャンク サイズを送信することがあります。 HTTP 1.1 ルールによってデコードされます)。eBay の BAD API を何時間もデコードしようとした後、最終的に VB.net でチャンクされた http 応答をデコードする関数を作成しました。多くのオンライン ツールの 1 つを使用して簡単に C# に変換できます。最初に、応答のコンテンツ タイプがチャンクされているかどうか HTTP 応答ヘッダーをチェックします。チャンクされている場合は、応答の本文をこの関数に渡すだけで、参照によって変数を取得して操作します。

Public Shared Sub DechunkString(ByRef strString As String)
        Dim intChunkSize As Integer = 0
        Dim strSeperator(0) As String
        strSeperator(0) = vbCrLf

        Dim strChunks As String() = strString.Split(strSeperator, StringSplitOptions.RemoveEmptyEntries)

        strString = ""

        For Each strChunk As String In strChunks
            If strChunk.Length = intChunkSize Then ' for normal behaviour this would be enough
                strString &= strChunk
                intChunkSize = 0
                Continue For
            End If

            ' because of sometimes wrong chunk sizes let's check if the next chunk size is a valid hex, and if not, treat it as part chunk
            If strChunk.Length <= 4 Then ' this is probably a valid hex, but could have invalid characters
                Try
                    intChunkSize = CInt("&H" & strChunk.Trim())

                    If intChunkSize = 0 Then
                        Exit For
                    End If

                    Continue For
                Catch ex As Exception

                End Try
            End If

            ' if got to this point, then add the chunk to output and reset chunk size
            strString &= strChunk
            intChunkSize = 0
        Next
    End Sub

誰かが多くの時間と神経を節約するのに役立つことを願っています.

于 2011-08-26T09:08:27.177 に答える
0

「.net がデータをドロップする」とはどういう意味ですか?

名前と値のペアを投稿するだけの場合は、次のように実行できます。

WebClient client = new WebClient();
NameValueCollection nv = new NameValueCollection();
nv.Add("password", "theword");
client.UploadValues(url, "POST", nv);

UploadValues に渡されるパラメーターの順序を確認する必要があるかもしれないことに注意してください。この順序が正しいかどうかはわかりません。現在、MSDN を調べるのが面倒です。

于 2010-02-24T18:03:31.840 に答える