2009-07-16 48 views
10

我有一个荒谬的时间试图让.NET API工作(ZeepMobile,如果你感兴趣)与.NET ...我已经围绕.NET几年,但所有这些社交网络和API的东西,我需要进入HttpWebRequest一点。我是新手,但不是全新的;我能够将我的网站连接到Twitter,而没有太多大惊小怪(即,我能够修改某人的代码为我工作)。从HttpWebRequest.GetResponse处理错误

无论如何,他们的API的工作方式是发送短信,你发送一个POST,他们回应给你。我可以发送它很好,但每次我做,而不是回应一些有用的东西来找出错误是什么,我得到了黄色错误页面(YEPOD)说了一些东西的效果“远程服务器返回错误:(400)错误的请求。“这发生在我的路线:

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

有没有办法简单地从服务器接收的错误,而不是具有Web服务器抛出一个异常并给我YEPOD?

或更好的是,任何人都可以发布他们的Zeep代码的工作示例? :)

谢谢!

编辑:这里是我的整个代码块:

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的,是有办法只查看一下头是发送和接收双方的?我试图使用提琴手,但要么我不知道如何使用它或它完全没有帮助... – Jason 2009-07-16 20:28:23

+0

请提供您的请求代码 – cdm9002 2009-07-16 20:31:42

+0

ps - 对于那些试图让您的zeep代码工作,上面的代码将返回400错误请求:“消息时间与服务器时钟差别很大或未提供日期标题。”仍然在努力,因为你不能修改“日期”标头... – Jason 2009-07-16 21:16:37

回答

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 
1

我认为这是正常的,当请求返回4XX或者5XX代码WebException抛出。你只需要抓住它并适当地处理它。

你打电话给GetResponse之后看过Headers系列吗?

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