2009-07-16 30 views
10

Estoy teniendo un tiempo ridículo tratando de obtener una API de SMS trabajando (ZeepMobile, si está interesado) con .NET ... He estado alrededor de .NET durante algunos años, pero con todas estas redes sociales y material de API, necesito ingresar un poco a HttpWebRequest. Soy nuevo en eso, pero no completamente nuevo; Pude conectar mi sitio a Twitter sin demasiado alboroto (es decir, pude modificar el código de alguien para que funcione para mí).Manejo de errores de HttpWebRequest.GetResponse

De todos modos, la forma en que funciona su API es enviar un mensaje de texto, usted les envía un POST y responden de nuevo a usted. Puedo enviarlo muy bien, pero cada vez que lo hago, en lugar de repetir algo útil para descubrir cuál es el error, obtengo la página de error de muerte amarilla (YEPOD) diciendo algo en el sentido de "El servidor remoto devolvió una error: (400) Solicitud incorrecta ". Esto ocurre en mi línea:

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

¿Hay alguna manera de recibir simplemente el error desde el servidor en lugar de que el servidor web una excepción y dame la YEPOD?

O mejor aún, ¿alguien puede publicar un ejemplo de trabajo de su código Zeep? :)

Gracias!

EDIT: Aquí es toda mi bloque de código:

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, ​​¿hay una manera de ver exactamente lo que los encabezados son tanto de la emisión y la recibirán? Estoy tratando de usar el violín pero no sé cómo usarlo o es completamente inútil ... – Jason

+0

Por favor ingrese su código de solicitud – cdm9002

+0

ps - para aquellos que intentan hacer que su código zeep funcione, el código anterior será devuelve una solicitud incorrecta 400: "El tiempo del mensaje difiere mucho del reloj del servidor o no se proporcionó el encabezado Fecha". Todavía estoy trabajando en eso, ya que no puedes modificar el encabezado "Fecha" ... – Jason

Respuesta

22

Prueba esto:

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

Aquí está el código, un poco modificada:

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 

cabeceras de dumping:

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 ... no soy tan bueno con C# ... ¿Puedes traducirlo? en VB? – Jason

+0

ya está allí Lo siento –

+0

¿Qué significa "Using" en VB? Nunca lo he visto antes ... – Jason

1

Creo que es normal para un WebException a ser lanzado cuando la solicitud devuelve un código 4xx o 5xx. Solo necesita atraparlo y manejarlo apropiadamente.

¿Ha mirado la colección Headers después de la llamada al 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

no puedo llegar tan lejos ... solo arroja una excepción en el GetResponse ... ¿cómo verificaría los encabezados después de eso? – Jason

+0

A partir del código de error de 400 "solicitud incorrecta", supuse que se había lanzado la excepción en respuesta a un error del otro servidor. ¿Un error en su código no causaría un 500? –

+0

¿tiene código real para verificar los encabezados? He intentado tantas cosas que ahora mi cabeza está dando vueltas ... gracias :( – Jason