10 Stimmen

Behandlung von Fehlern aus HttpWebRequest.GetResponse

Ich habe eine lächerliche Zeit mit dem Versuch, eine SMS-API zum Laufen zu bringen ( ZeepMobile Ich habe um .NET für ein paar Jahre gewesen, aber mit all diesen sozialen Netzwerken und API-Zeug, muss ich in die HttpWebRequest ein bisschen zu bekommen. Ich bin neu darin, aber nicht völlig neu; Ich war in der Lage, meine Website zu Twitter ohne viel Aufhebens Haken (dh, ich war in der Lage, jemandes Code zu ändern, um für mich arbeiten).

Wie auch immer, die API funktioniert so, dass man eine SMS-Nachricht sendet, man sendet eine POST und sie antworten zurück. Ich kann sie problemlos senden, aber jedes Mal, wenn ich das tue, erhalte ich statt eines hilfreichen Echos, mit dem ich herausfinden kann, was der Fehler ist, die gelbe Fehlerseite des Todes (YEPOD), die etwas wie folgt besagt: "The remote server returned an error: (400) Bad Request." Dies geschieht in meiner Zeile:

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

Gibt es eine Möglichkeit, einfach den Fehler vom Server zu erhalten, anstatt dass der Webserver eine Ausnahme auslöst und mir den YEPOD gibt?

Oder noch besser: Kann jemand ein funktionierendes Beispiel für seinen Zeep-Code posten? :)

Gracias.

EDIT: Hier ist mein ganzer Codeblock:

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

0 Stimmen

Ps, gibt es eine Möglichkeit, einfach zu sehen, was die Header sind sowohl der senden und empfangen? ich versuche, Fiddler zu verwenden, aber entweder ich weiß nicht, wie es zu verwenden, oder es ist einfach völlig unhelpful...

0 Stimmen

Bitte geben Sie Ihren Anfragecode an

0 Stimmen

Ps - für diejenigen, die versuchen, ihren Zeep-Code zum Laufen zu bringen, wird der obige Code eine 400 Bad Request zurückgeben: "Die Nachrichtenzeit weicht zu stark von der Serveruhr ab oder der Date-Header wurde nicht übermittelt." Daran arbeiten wir noch, da man den "Date"-Header nicht ändern kann...

26voto

John Saunders Punkte 159011

Versuchen Sie dies:

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

C#-Version

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());
                }
            }
        }
    }    
}

Hier ist Ihr Code, ein wenig geändert:

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

Dumpin

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

1voto

Tim Sylvester Punkte 22343

Ich denke, es ist normal, dass ein WebException die ausgelöst wird, wenn die Anfrage einen 4xx- oder 5xx-Code zurückgibt. Sie müssen es nur abfangen und entsprechend behandeln.

Haben Sie sich die Headers Sammlung nach dem Aufruf von GetResponse ?

es wirft nur eine Ausnahme bei der GetResponse... wie würde ich die Header nach, dass überprüfen?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X