2011-10-26 28 views
13

Hola Trato de escribir una solicitud HTTP en C# (Post), pero necesito ayuda con un errorCómo escribir una solicitud HTTP

Expl: Quiero enviar el contenido de un archivo DLC con el servidor y recibe el contenido descifrado.

C# Código

public static void decryptContainer(string dlc_content) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste"); 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

    using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
    { 
     writer.Write("content=" + dlc_content); 
    } 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     Console.WriteLine(reader.ReadToEnd()); 
    } 
} 

y aquí tiene la solicitud html

<form action="/decrypt/paste" method="post"> 
    <fieldset> 
     <p class="formrow"> 
      <label for="content">DLC content</label> 
      <input id="content" name="content" type="text" value="" /> 
     </p> 
     <p class="buttonrow"><button type="submit">Submit »</button></p> 
    </fieldset> 
</form> 

mensaje de error:

{ 
    "form_errors": { 
     "__all__": [ 
     "Sorry, an error occurred while processing the container." 
     ] 
    } 
} 

sería muy útil si alguien me podría ayudar a resolver el problema!

+0

http://codesamplez.com/programming/http-request-c-sharp – happy

Respuesta

14

No ha establecido una longitud de contenido, lo que podría causar problemas. También puede probar a escribir bytes directamente a la corriente en lugar de convertirlo en ASCII primera .. (hacerlo de la manera opuesta a como lo está haciendo en este momento), por ejemplo:

public static void decryptContainer(string dlc_content) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste"); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

     byte[] _byteVersion = Encoding.ASCII.GetBytes(string.Concat("content=", dlc_content)); 

     request.ContentLength = _byteVersion.Length 

     Stream stream = request.GetRequestStream(); 
     stream.Write(_byteVersion, 0, _byteVersion.Length); 
     stream.Close(); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
     { 
      Console.WriteLine(reader.ReadToEnd()); 
     } 
    } 

tengo personalmente encontró publicaciones como esta para ser un poco "fidgity" en el pasado. También podría intentar configurar ProtocolVersion en la solicitud.

0

Obtener la corriente asociada con la respuesta primero y luego pasar que en el StreamReader de la siguiente manera:

Stream receiveStream = response.GetResponseStream();  

    using (StreamReader reader = new StreamReader(receiveStream, Encoding.ASCII)) 
    { 
     Console.WriteLine(reader.ReadToEnd()); 
    } 
1

Un problema que veo de inmediato es que se necesita a URL valor del parámetro de codificación content. Use HttpUtility.UrlEncode() para eso. Aparte de eso, puede haber otros problemas allí, pero es difícil decir que no se sabe qué servicio hace. El error es demasiado genérico y podría significar cualquier cosa

6

Me simplificar el código, así:

public static void decryptContainer(string dlc_content) 
{ 
    using (var client = new WebClient()) 
    { 
     var values = new NameValueCollection 
     { 
      { "content", dlc_content } 
     }; 
     client.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     string url = "http://dcrypt.it/decrypt/paste"; 
     byte[] result = client.UploadValues(url, values); 
     Console.WriteLine(Encoding.UTF8.GetString(result)); 
    } 
} 

También asegura que los parámetros de la petición están correctamente codificados.

+0

También asegura que los parámetros se codifican más o menos correctamente. Ver http://stackoverflow.com/a/10836145/4136325 –

+0

Ejemplo muy ligero. Gracias. +1 –

+0

¿Qué webClient usaste? –

1

request.ContentLength debe establecerse también.

Además, ¿hay alguna razón por la que usted está codificando ASCII frente a UTF8?

+0

HttpWebRequest establece ContentLength por sí mismo de forma predeterminada. application/x-www-form-urlencoded siempre estará en el rango ASCII, por lo que es idéntico entre ambas codificaciones. –

2
public string void decryptContainer(string dlc_content) //why not return a string, let caller decide what to do with it. 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste"); 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";//sure this is needed? Maybe just match the one content-type you expect. 
    using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
    { 
     writer.Write("content=" + Uri.EscapeDataString(dlc_content));//escape the value of dlc_content so that the entity sent is valid application/x-www-form-urlencoded 
    } 
    using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())//this should be disposed when finished with. 
    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

Aún puede haber un problema con lo que se está enviando.

0

Como no puedo comentar sobre la solución de Jon Hanna. Esto resolvió por mí: Uri.EscapeDataString

 // this is what we are sending 
     string post_data = "content=" + Uri.EscapeDataString(dlc_content); 

     // this is where we will send it 
     string uri = "http://dcrypt.it/decrypt/paste"; 

     // create a request 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.KeepAlive = false; 
     request.ProtocolVersion = HttpVersion.Version10; 
     request.Method = "POST"; 

     // turn our request string into a byte stream 
     byte[] postBytes = Encoding.ASCII.GetBytes(post_data); 

     // this is important - make sure you specify type this way 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = postBytes.Length; 

     Stream requestStream = request.GetRequestStream(); 

     // now send it 
     requestStream.Write(postBytes, 0, postBytes.Length); 
     requestStream.Close(); 

     // grab te response and print it out to the console along with the status code 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd()); 
     Console.WriteLine(response.StatusCode); 
Cuestiones relacionadas