2009-07-16 13 views
10

Mam niedorzeczny czas próbując uzyskać działającą funkcję API SMS (ZeepMobile, jeśli jesteś zainteresowany) z .NET ... Byłem w sieci .NET od kilku lat, ale przy całej tej sieci społecznościowej i API, muszę trochę wejść w HttpWebRequest. Jestem w tym nowy, ale nie całkiem nowy; Udało mi się podłączyć moją stronę do Twittera bez zbytniego zamieszania (tj. Byłem w stanie zmodyfikować czyjś kod do pracy dla mnie).Obsługa błędów z HttpWebRequest.GetResponse

W każdym razie, sposób działania ich API polega na wysyłaniu wiadomości SMS, wysyłaniu ich do POST i odpowiedzi na nie. Mogę wysłać to dobrze, ale za każdym razem, zamiast powtarzać coś, co jest pomocne, aby dowiedzieć się, co jest błędem, dostaję Yellow Error Page Of Death (YEPOD) mówiąc coś do skutku "Zdalny serwer zwrócił error: (400) Złe żądanie. " Dzieje się tak na mojej linii:

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

Czy istnieje jakiś sposób, aby po prostu pojawić się błąd z serwera zamiast mieć serwer WWW wyjątek i dać mi YEPOD?

A może jeszcze ktoś może opublikować działający przykład swojego kodu Zeep? :)

Dzięki!

EDIT: Oto cały mój blok kodu:

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, ​​czy istnieje sposób, aby po prostu sprawdzić, jakiego nagłówki są zarówno wysyłania i odbioru? Próbuję użyć skrzypka, ale albo nie wiem, jak go użyć, albo jest całkowicie nieprzydatny ... – Jason

+0

Proszę podać swój kod żądania – cdm9002

+0

ps - dla tych, którzy próbują uzyskać twój kod ze strony do pracy, powyższy kod będzie zwraca 400 nieprawidłowych żądań: "Czas wiadomości różni się znacznie od zegara serwera lub nagłówek daty nie został dostarczony." Nadal nad tym pracuję, ponieważ nie możesz zmodyfikować nagłówka "Data" ... – Jason

Odpowiedz

22

Spróbuj tego:

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# wersja

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

Oto kod, nieco zmodyfikowany:

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 nagłówki:

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 ... nie jestem tak dobry w C# ... możesz przetłumaczyć do VB? – Jason

+0

Już tam, przepraszam –

+0

co robi "Używanie" w VB? nigdy go nie widziałem ... – Jason

1

myślę, że to normalne, że WebException zostać wyrzucony, gdy żądanie zwraca 4xx lub 5xx kod. Po prostu musisz go złapać i odpowiednio się z nim postarać.

Czy obejrzałeś kolekcję Headers po dzwonieniu pod numer GetResponse?

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

Nie mogę zajść tak daleko ... to po prostu wyrzuca wyjątek w GetResponse ... jak sprawdziłbym nagłówki po tym? – Jason

+0

Od 400 kodu błędu "nieprawidłowego żądania", założyłem, że wyjątek został zgłoszony w odpowiedzi na błąd z drugiego serwera. Czy błąd w twoim kodzie nie spowodowałby 500? –

+0

czy masz rzeczywisty kod do sprawdzania nagłówków? Próbowałem już tak wielu rzeczy, teraz moja głowa wiruje ... dzięki :( – Jason