8

Web 例外が発生したときに、vb.net で HTTP Web 要求から応答テキストを取得するのが困難です。

これは私がやっているコードです。

Try
            myWebResponse = CType(request.GetResponse(), HttpWebResponse)
            myStreamReader = New StreamReader(myWebResponse.GetResponseStream())

            ResponseText = myStreamReader.ReadToEnd
            If myWebResponse.StatusCode = HttpStatusCode.Accepted Or myWebResponse.StatusCode = 200 Then
                SendResult = True 'Sent 
                SendStatus = 1 'message sent successfully
                Try
                    Integer.TryParse(myWebResponse.Headers("Number-Of-MT-PDU"), num_MT_PDU)
                Catch ex As Exception
                End Try
            Else
                SendStatus = 2 'message processed but not sent successfully
            End If
        Catch e As WebException
            If (e.Status = WebExceptionStatus.ProtocolError) Then
                Dim response As WebResponse = e.Response
                Using (response)
                    Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
                    statusCode = httpResponse.StatusCode
                    Try
                        myStreamReader = New StreamReader(response.GetResponseStream())
                        Using (myStreamReader)
                            ResponseText = myStreamReader.ReadToEnd & "Status Description = " & HttpWebResponse.StatusDescription
                        End Using
                    Catch ex As Exception
                        Logger.LogError(Me, ex)
                    End Try
                End Using

厄介なことに、私が連絡している API は有効な応答として 404 を使用します。リクエストをブラウザに入れると、いくつかのメッセージ テキストが表示されます。そのテキストを自分のプログラムで使用できるようにしたいと考えています。有効な 404 応答と実際のエラーを区別できないと思うので、単にエラー コードを使用してアクションを決定することはできません。

コードでは、この行

myWebResponse = CType(request.GetResponse(), HttpWebResponse)

例外をスローします。

例外では、404 コードと説明は取得できますが、応答ストリームは取得できません。常にヌルです。

200 の応答を受け取った場合、応答ストリームに問題なくテキストが表示されます。

Web 例外応答オブジェクト (Visual Studio デバッガー) で、ヘッダーとオブジェクト値を確認しましたが、応答テキストがどこにも見つかりません。リクエスト URL をブラウザに貼り付けると、404 であってもレスポンス テキストが返されます。

フィドラーでの生の応答:

HTTP/1.1 404 Not Found Connection: close Content-Type: text/plain; charset=UTF-8 Content-Length: 35 "The response Message"

プログラムで「応答メッセージ」を取得する方法についてのアイデアはありますか? サーバーで .Net を使用する必要があります。

誰でもできる助けをありがとう。

4

2 に答える 2

4

このLINQPadクエリは正常に機能し、Webサーバーの「NotFound」エラーWebページによって提供されたHTMLをダンプします。

Dim rq = System.Net.WebRequest.Create(New Uri("http://localhost/test"))
Try 
  Dim rs = rq.GetResponse
  rs.Dump
Catch Ex As System.Net.WebException
 Dim rs = Ex.Response
 Call (New StreamReader(rs.GetResponseStream)).ReadToEnd.Dump
End Try

HttpWebResponse.StatusDescription参考までに、あなたのコードは、推定されるタイプミス(および「無関係なもの」のコメントアウト)を除いて、LINQPadクエリ(.NET 4.0)として機能します。

Dim request = WebRequest.Create("http://localhost/test")
Dim myStreamReader As StreamReader
Dim SendStatus As Integer = -1
Dim statusCode As HttpStatusCode
Dim ResponseText As String
Try
    Dim myWebResponse = CType(request.GetResponse(), HttpWebResponse)
        myStreamReader = New StreamReader(myWebResponse.GetResponseStream())

        ResponseText = myStreamReader.ReadToEnd
        If myWebResponse.StatusCode = HttpStatusCode.Accepted Or myWebResponse.StatusCode = 200 Then
            'SendResult = True 'Sent 
            SendStatus = 1 'message sent successfully
            'Try
            '    Integer.TryParse(myWebResponse.Headers("Number-Of-MT-PDU"), num_MT_PDU)
            'Catch ex As Exception
            'End Try
        Else
            SendStatus = 2 'message processed but not sent successfully
        End If
    Catch e As WebException
        If (e.Status = WebExceptionStatus.ProtocolError) Then
            Dim response As WebResponse = e.Response
            Using (response)
                Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
                statusCode = httpResponse.StatusCode
                Try
                    myStreamReader = New StreamReader(response.GetResponseStream())
                    Using (myStreamReader)
                        ResponseText = myStreamReader.ReadToEnd & "Status Description = " & httpResponse.StatusDescription ' HttpWebResponse.StatusDescription
                    End Using
                Catch ex As Exception
                    'Logger.LogError(Me, ex)
                    ex.Dump("Exception")
                End Try
            End Using
      End If
End Try
ResponseText.Dump("ResponseText")

Asまた、上記のコード(推論された句が追加され、.Dump呼び出しがに変換されているConsole.WriteLine)がVB8を使用する.NET2.0で機能することも確認しました。

于 2012-11-03T13:22:53.230 に答える