2009-07-16 36 views
10

Tôi đang có một thời gian vô lý cố gắng để có được một API SMS làm việc (ZeepMobile, nếu bạn quan tâm) với .NET ... Tôi đã xung quanh .NET trong một vài năm, nhưng với tất cả các công cụ mạng xã hội và API này, tôi cần phải truy cập vào HttpWebRequest một chút. Tôi mới ở đó, nhưng không hoàn toàn mới; Tôi đã có thể kết nối trang web của mình với Twitter mà không quá nhiều phiền toái (ví dụ, tôi có thể sửa đổi mã của ai đó để làm việc cho tôi).Xử lý lỗi từ HttpWebRequest.GetResponse

Dù sao, cách API của họ hoạt động là gửi tin nhắn SMS, bạn gửi cho họ một POST và họ trả lời lại cho bạn. Tôi có thể gửi nó tốt, nhưng mỗi khi tôi làm, thay vì lặp lại một cái gì đó hữu ích để tìm ra lỗi là gì, tôi nhận được trang lỗi màu vàng của cái chết (YEPOD) nói điều gì đó có hiệu lực của "Máy chủ từ xa trả về lỗi: (400) Yêu cầu không hợp lệ ". Điều này xảy ra trên dòng của tôi:

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

Có cách nào đơn giản nhận lỗi từ máy chủ thay vì yêu cầu máy chủ web ném ngoại lệ và cung cấp cho tôi YEPOD không?

Hoặc tốt hơn, bất kỳ ai cũng có thể đăng một ví dụ hoạt động về mã Zeep của họ? :)

Cảm ơn!

EDIT: Dưới đây là toàn bộ khối mã của tôi:

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, ​​là có một cách để chỉ xem những gì các tiêu đề là của cả gửi và nhận? Tôi đang cố gắng sử dụng công cụ tìm kiếm nhưng tôi không biết cách sử dụng nó hoặc nó hoàn toàn không hữu ích ... – Jason

+0

Vui lòng cung cấp mã yêu cầu – cdm9002

+0

ps - đối với những người cố gắng để mã zeep của bạn hoạt động, mã trên sẽ trả về 400 Yêu cầu không hợp lệ: "Thời gian tin nhắn khác nhiều so với đồng hồ máy chủ hoặc tiêu đề Ngày không được cung cấp." Vẫn còn làm việc trên đó, vì bạn không thể sửa đổi tiêu đề "Ngày" ... – Jason

Trả lời

22

Hãy thử điều này:

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 phiên bản #

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

Dưới đây là mã của bạn, thay đổi một chút:

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 

tiêu đề bán phá giá:

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 ... Tôi không tốt w/C# ... bạn có thể dịch vào VB? – Jason

+0

Xin lỗi –

+0

"Sử dụng" làm gì trong VB? không bao giờ thấy nó trước đây ... – Jason

1

Tôi nghĩ đó là bình thường đối với một WebException được ném khi yêu cầu trả về một 4xx hay 5xx mã. Bạn chỉ cần nắm bắt nó và xử lý nó một cách thích hợp.

Bạn đã xem bộ sưu tập Headers sau cuộc gọi đến GetResponse chưa?

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

tôi không thể đạt được điều đó ... nó chỉ ném một ngoại lệ tại GetResponse ... làm thế nào tôi sẽ kiểm tra các tiêu đề sau đó? – Jason

+0

Từ mã lỗi "yêu cầu xấu" 400, tôi giả định rằng ngoại lệ đã được ném để phản hồi việc nhận lỗi từ máy chủ khác. Sẽ không có lỗi trong mã của bạn gây ra 500? –

+0

bạn có mã thực tế để kiểm tra tiêu đề không? Tôi đã thử rất nhiều thứ bây giờ đầu của tôi đang xoáy ... cảm ơn: ( – Jason