Обработка ошибок из HttpWebRequest.метод GetResponse
у меня нелепое время, пытаясь заставить SMS API работать (ZeepMobile, если вам интересно) с .NET... я был вокруг .NET в течение нескольких лет, но со всеми этими социальными сетями и API-файлами мне нужно немного попасть в HttpWebRequest. Я новичок в этом, но не совсем новый; я смог подключить свой сайт к Twitter без лишней суеты (т. е. я смог изменить чей-то код, чтобы работать на меня).
в любом случае, способ их работы API заключается в отправке SMS-сообщение, вы отправляете им сообщение,и они отвечают вам. Я могу отправить его просто отлично, но каждый раз, когда я это делаю, а не Эхо назад что-то полезное, чтобы выяснить, что такое ошибка, я получаю желтую страницу ошибки смерти (YEPOD), говорящую что-то вроде "удаленный сервер вернул ошибку: (400) плохой запрос."Это происходит на моей линии:
'...creation of httpwebrequest here...'
Dim myWebResponse As WebResponse
myWebResponse = request.GetResponse() '<--- error line
есть ли способ, чтобы просто получить ошибку от сервера, а не сервер выдает исключение и дать мне ЙЕПОД?
или еще лучше, может кто-нибудь опубликовать пример кода 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
2 ответов
попробуйте это:
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
Я думаю, что это нормально для WebException
быть брошенным, когда запрос возвращает код 4xx или 5xx. Вам просто нужно поймать его и обращаться с ним соответствующим образом.
вы смотрели Headers
коллекция после вызова GetResponse
?
Он просто выдает исключение в GetResponse... как я буду проверять заголовки после этого?
Try
myWebResponse = request.GetResponse()
Catch x As WebException
log, cleanup, etc.
Finally
log/inspect headers?
End Try