Обработка ошибок из HttpWebRequest.GetResponse

У меня время нелепо, пытаясь заставить работать API SMS (ZeepMobile, если вам интересно) с .NET... Я занимаюсь .NET в течение нескольких лет, но со всеми этими социальными сетями и материалами API мне нужно немного входить в HttpWebRequest. Я новичок в этом, но не совсем новый; Я смог подключить свой сайт к Twitter без лишней суеты (т.е. Мне удалось изменить код для работы для меня).

В любом случае, как работает их API, необходимо отправить SMS-сообщение, вы отправляете им POST, и они отвечают вам. Я могу отправить его просто отлично, но каждый раз, когда я делаю, вместо того, чтобы отсылать назад что-то полезное, чтобы выяснить, что такое ошибка, я получаю желтую страницу ошибки смерти (YEPOD), говорящую о том, что "Удаленный сервер вернул Ошибка: (400)" Плохой запрос". Это происходит на моей линии:

'...creation of httpwebrequest here...'
Dim myWebResponse As WebResponse
myWebResponse = request.GetResponse() '<--- error line

Есть ли способ просто получить сообщение об ошибке с сервера, вместо того, чтобы веб-сервер выдал исключение и дал мне YEPOD?

Или еще лучше, может ли кто-нибудь опубликовать рабочий пример своего кода Zeep?:)

Спасибо!

EDIT: Здесь весь мой блок кода:

Public Shared Function SendTextMessage(ByVal username As String, _
ByVal txt As String) As String
    Dim content As String = "user_id=" + _
username + "&body=" + Current.Server.UrlEncode(txt)

    Dim httpDate As String = DateTime.Now.ToString("r")
    Dim canonicalString As String = API_KEY & httpDate & content

    Dim encoding As New System.Text.UTF8Encoding
    Dim hmacSha As New HMACSHA1(encoding.GetBytes(SECRET_ACCESS_KEY))

    Dim hash() As Byte = hmacSha.ComputeHash(encoding.GetBytes(canonicalString))
    Dim b64 As String = Convert.ToBase64String(hash)

    'connect with zeep'
    Dim request As HttpWebRequest = CType(WebRequest.Create(_
"https://api.zeepmobile.com/messaging/2008-07-14/send_message"), HttpWebRequest)
    request.Method = "POST"
    request.ServicePoint.Expect100Continue = False

    ' set the authorization levels'
    request.Headers.Add("Authorization", "Zeep " & API_KEY & ":" & b64)
    request.ContentType = "application/x-www-form-urlencoded"
    request.ContentLength = content.Length

    ' set up and write to stream'
    Dim reqStream As New StreamWriter(request.GetRequestStream())
    reqStream.Write(content)
    reqStream.Close()
    Dim msg As String = ""
    msg = reqStream.ToString

    Dim myWebResponse As WebResponse
    Dim myResponseStream As Stream
    Dim myStreamReader As StreamReader

    myWebResponse = request.GetResponse()

    myResponseStream = myWebResponse.GetResponseStream()
    myStreamReader = New StreamReader(myResponseStream)
    msg = myStreamReader.ReadToEnd()
    myStreamReader.Close()
    myResponseStream.Close()

    ' Close the WebResponse'
    myWebResponse.Close()
    Return msg
End Function

Ответ 1

Попробуйте следующее:

Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
'' set up request
Try
    Using response = req.GetResponse()
        '' success in here
    End Using
Catch ex As WebException
    Console.WriteLine(ex.Status)
    If ex.Response IsNot Nothing Then
        '' can use ex.Response.Status, .StatusDescription
        If ex.Response.ContentLength <> 0 Then
            Using stream = ex.Response.GetResponseStream()
                Using reader = New StreamReader(stream)
                    Console.WriteLine(reader.ReadToEnd())
                End Using
            End Using
        End If
    End If
End Try

Версия на С#

HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
// set up request
try {
    using (var response = req.GetResponse()) {
        // success in here
        }
}
catch (WebException ex) {
    Console.WriteLine(ex.Status);
    if (ex.Response != null) {
        // can use ex.Response.Status, .StatusDescription
        if (ex.Response.ContentLength != 0) {
            using (var stream = ex.Response.GetResponseStream()) {
                using (var reader = new StreamReader(stream)) {
                    Console.WriteLine(reader.ReadToEnd());
                }
            }
        }
    }    
}

Здесь ваш код немного изменился:

Try
    'connect with zeep'
    Dim request As HttpWebRequest = CType(WebRequest.Create( _
"https://api.zeepmobile.com/messaging/2008-07-14/send_message"), HttpWebRequest)
    request.Method = "POST"
    request.ServicePoint.Expect100Continue = False

    ' set the authorization levels'
    request.Headers.Add("Authorization", "Zeep " & API_KEY & ":" & b64)
    request.ContentType = "application/x-www-form-urlencoded"
    request.ContentLength = content.Length

    ' set up and write to stream'
    Using requestStream As Stream = request.GetRequestStream()
        Using requestWriter As New StreamWriter(requestStream)
            requestWriter.Write(content)
        End Using
    End Using

    Using myWebResponse As WebResponse = request.GetResponse()
        Using myResponseStream As Stream = myWebResponse.GetResponseStream()
            Using myStreamReader As StreamReader = New StreamReader(myResponseStream)
                Return myStreamReader.ReadToEnd()
            End Using
        End Using
    End Using
Catch ex As WebException
    Console.WriteLine(ex.Status)
    If ex.Response IsNot Nothing Then
        '' can use ex.Response.Status, .StatusDescription
        If ex.Response.ContentLength <> 0 Then
            Using stream = ex.Response.GetResponseStream()
                Using reader = New StreamReader(stream)
                    Console.WriteLine(reader.ReadToEnd())
                End Using
            End Using
        End If
    End If
End Try

Сбрасывающие заголовки:

Dim headers As WebHeaderCollection = request.Headers
' Displays the headers. Works with HttpWebResponse.Headers as well
Debug.WriteLine(headers.ToString())

' And so does this
For Each hdr As String In headers
    Dim headerMessage As String = String.Format("{0}: {1}", hdr, headers(hdr))
    Debug.WriteLine(headerMessage)
Next

Ответ 2

Я думаю, что нормальный для WebException должен быть брошен, когда запрос возвращает код 4xx или 5xx. Вам просто нужно поймать его и обработать соответствующим образом.

Вы просмотрели коллекцию Headers после вызова GetResponse?

он просто генерирует исключение в GetResponse... как бы проверить заголовки после этого?

Try
    myWebResponse = request.GetResponse()
Catch x As WebException
    log, cleanup, etc.
Finally
    log/inspect headers?
End Try