2009-07-16 3 views
10

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

В любом случае, как их работает 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 
+0

пс, есть способ, чтобы просто посмотреть, что заголовки имеют как отправлять и получать? я пытаюсь использовать скрипач, но либо я не знаю, как его использовать, либо просто совершенно бесполезно ... – Jason

+0

Просьба представить ваш код запроса – cdm9002

+0

ps - для тех, кто пытается заставить ваш код zeep работать, приведенный выше код будет return 400 Bad Request: «Время сообщения отличается от времени сервера, или заголовок Date не был предоставлен». Все еще работаю над этим, так как вы не можете изменить заголовок «Дата» ... – Jason

ответ

22

Попробуйте это:

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# версия

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

ermm ... я не так хорош w/C# ... вы можете перевести в VB? – Jason

+0

Уже есть. Извините –

+0

Что делает «Использование» в VB? Никогда не видел его раньше ... – Jason

1

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

Вы просмотрели коллекцию Headers после звонка по телефону 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

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

+0

Из кода ошибки 400 «плохой запрос» я предположил, что исключение было отправлено в ответ на получение ошибки с другого сервера. Не будет ли ошибка в вашем коде причиной 500? –

+0

У вас есть реальный код для проверки заголовков? Я пробовал так много вещей, теперь моя голова крутится ... спасибо :( – Jason