2009-07-16 7 views
10

Ich habe eine lächerliche Zeit versucht, eine SMS-API (ZeepMobile, wenn Sie interessiert sind) mit .NET zu bekommen ... Ich bin seit ein paar Jahren mit .NET, Aber mit all diesen Social-Networking-und API-Zeug, muss ich ein wenig in die HttpWebRequest bekommen. Ich bin neu darin, aber nicht ganz neu; Ich war in der Lage, meine Seite ohne viel Aufhebens mit Twitter zu verbinden (dh ich konnte den Code von jemandem ändern, um für mich zu arbeiten).Fehlerbehandlung von HttpWebRequest.GetResponse

Wie auch immer, die Art, wie ihre API funktioniert, ist eine SMS zu senden, senden Sie ihnen einen POST und sie antworten Ihnen zurück. Ich kann es gut senden, aber jedes Mal, wenn ich etwas zurückgebe, was hilfreich ist, um herauszufinden, was der Fehler ist, bekomme ich die gelbe Fehlerseite des Todes (YEPOD), die etwas mit dem Effekt "Der entfernte Server antwortet Fehler: (400) Schlechte Anfrage. Dies geschieht auf meiner Linie:

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

Gibt es eine Möglichkeit die Fehler vom Server einfach zu erhalten, anstatt haben den Web-Server eine Ausnahme aus und geben Sie mir die YEPOD?

Oder noch besser, kann jemand ein funktionierendes Beispiel ihres Zeep-Codes veröffentlichen? :)

Danke!

EDIT: Hier ist meine ganze 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

ps, ​​ist es eine Möglichkeit, nur um zu sehen, was die Header sind sowohl in der Sende- und Empfangs? Ich versuche Fiddler zu verwenden, aber entweder weiß ich nicht, wie ich es benutzen soll oder es ist einfach völlig nutzlos ... – Jason

+0

Bitte geben Sie Ihren Anfragecode an – cdm9002

+0

ps - für diejenigen, die versuchen, Ihren Zeep Code zum Funktionieren zu bringen, wird der obige Code eine 400 Bad Request: "Nachricht Zeit unterscheidet sich viel von Server Uhr oder Datum Header wurde nicht geliefert." Arbeiten Sie noch daran, da Sie den Header "Date" nicht ändern können ... – Jason

Antwort

22

Try this:

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 der Code, verändert ein wenig:

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 

Dumping-Header:

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 
+0

ermm ... ich bin nicht so gut w/C# ... kannst du übersetzen in VB? – Jason

+0

Schon da. Sorry –

+0

Was macht "Using" in VB? Nie zuvor gesehen ... – Jason

1

Ich denke, es ist normal für eine WebException zu geworfen werden, wenn die Anforderung eine 4xx oder 5xx-Code zurückgibt. Sie müssen es nur fangen und entsprechend behandeln.

Haben Sie die Headers Sammlung nach dem Anruf an GetResponse betrachtet?

it just throws an exception at the GetResponse... how would I check the headers after that?

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

ich kann nicht so weit kommen ... es wirft nur eine Ausnahme bei der GetResponse ... Wie würde ich die Header danach überprüfen? – Jason

+0

Aus dem Fehlercode 400 "Fehleranforderung" ging ich davon aus, dass die Ausnahme als Reaktion auf einen Fehler vom anderen Server ausgelöst wurde. Würde ein Fehler in Ihrem Code nicht 500 verursachen? –

+0

haben Sie tatsächlichen Code zum Überprüfen der Header? Ich habe schon so viele Dinge ausprobiert, mein Kopf wirbelt ... danke :( – Jason