Как я могу прочитать ответ от веб-запроса, когда Статус не 200? - PullRequest
7 голосов
/ 22 августа 2011

Мне трудно получить текст ответа из веб-запроса HTTP в vb.net, когда я получаю веб-исключение.

Это код, с которым я делаю это.

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, я получаю текст в потоке Ответов без проблем.

В объекте ответа веб-исключения (в отладчике Visual Studios) я проверил заголовки и значения объекта и нигде не могу найти текст ответа. Если я вставлю URL-адрес запроса в браузер, я получу ответный текст, даже если это 404.

Необработанный ответ в fiddler:

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

Любые идеи о том, как я могу получить "Ответное сообщение" в моей программе? Я должен использовать .Net на сервере.

Спасибо за любую помощь, которую может оказать любой.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2012

Этот запрос LINQPad работает нормально, выдает 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

К вашему сведению, ваш код работает для меня, за исключением предполагаемой опечатки re 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) работает в .NET 2.0 с VB8.

0 голосов
/ 13 марта 2014

Обратите внимание, что ключ в том, что, хотя действие GetResponseStream () генерирует исключение .NET WebException, HttpWebResponse фактически передается объекту WebException, поэтому в Catch вы делаете новый GetResponseStream () для WebException.Объект ответа.

Ниже приведен очень похожий код для того, когда в Catch начального GetResponseStream ()

   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
...