【问题标题】:How can I read the response from a web request when the Status is not 200?当状态不是 200 时,如何读取来自 Web 请求的响应?
【发布时间】:2011-08-22 11:03:55
【问题描述】:

当我收到 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 响应,我会在 Response 流中得到文本没有问题。

在 Web 异常响应对象中(在 Visual Studios 调试器中),我检查了标头和对象值,但在任何地方都找不到响应文本。如果我将请求 URL 粘贴在浏览器中,我会返回响应文本,即使它是 404。

提琴手的原始响应:

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

关于如何在我的程序中获得“响应消息”的任何想法?我必须在服务器上使用 .Net。

感谢任何人提供的任何帮助。

【问题讨论】:

  • 可能提供线索的一件事是使用Fiddler 来查看实际通过网络返回的内容
  • 我想我以前也遇到过同样的问题。无法使用网络客户端。等一下,让我查一下。
  • 我问过类似的问题stackoverflow.com/questions/9062089/…。那里也没有答案。
  • 我刚刚使用WebClient.DownloadData 和基本WebException 打了localhost/test(它不存在)(我使用的是DotLisp,所以“顶部”有一个BacktraceException 和一个TargetInvocationException。)@ 987654328@ 存在,New StreamReader(response.GetResponseStream()).ReadToEnd 的等效项可以正常工作。

标签: vb.net webexception


【解决方案1】:

此 LINQPad 查询工作正常,转储了我的 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

仅供参考,您的代码对我有用,除了假定的错字 reHttpWebResponse.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 的.NET 2.0 中有效。

【讨论】:

  • 您好,非常感谢您的回复。我问这个问题已经有一段时间了,我无法访问发生问题的原始代码或服务器,但我会接受你的回答,因为它看起来不错。唯一的事情是我被困在运行 .Net 2.0 的服务器上(公司显然害怕改变),我记得能够获得标准的 404 服务器响应文本,但不是我调用的 API 返回的文本。无论如何,希望这一切都会对某个地方的人有所帮助。
  • 感谢这个答案很有帮助
【解决方案2】:

请注意,关键是即使 GetResponseStream() 的行为抛出了一个 .NET WebException,HttpWebResponse 实际上是传递给 WebException 对象的,所以当在 Catch 中时,您对 WebException 执行新的 GetResponseStream()。响应对象。

下面,在初始 GetResponseStream() 的 Catch 中的代码非常相似

   Try 
            OriginalResponseStream = GetResponseStream(OriginalHTTPWebResponse)

   Catch wex as WebException
            Dim response As WebResponse = wex.Response
            Dim statusCode As HttpStatusCode
            Dim ResponseText As String

            Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
            statusCode = httpResponse.StatusCode

            Try

                Dim myStreamReader As New StreamReader(response.GetResponseStream())
                Using (myStreamReader)
                    ResponseText = myStreamReader.ReadToEnd
                    Process(ResponseText) '<===as in whatever you need to do with the response
                End Using
            Catch ex As Exception

                HandleIt(ex.Message) '<===as in whatever you want to do if Exception during the above

            End Try

   End Try

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多