2010-01-21 14 views
6

Me gustaría crear mis propias solicitudes HTTP personalizadas. La clase WebClient es muy buena, pero crea las solicitudes HTTP automáticamente. Estoy pensando que necesito crear una conexión de red al servidor web y pasar mis datos a través de esa transmisión, pero no estoy familiarizado con las clases de la biblioteca que apoyarían ese tipo de cosas.¿Cómo creo una solicitud HTTP manualmente en .Net?

(Contexto, estoy trabajando en algo de código para una clase de programación web que estoy enseñando. Quiero que mis estudiantes a entender los conceptos básicos de lo que está sucediendo dentro de la "recuadro negro" de HTTP.)

Respuesta

17

Para entender realmente la parte interna del protocolo HTTP se puede utilizar TcpClient clase:

using (var client = new TcpClient("www.google.com", 80)) 
{ 
    using (var stream = client.GetStream()) 
    using (var writer = new StreamWriter(stream)) 
    using (var reader = new StreamReader(stream)) 
    { 
     writer.AutoFlush = true; 
     // Send request headers 
     writer.WriteLine("GET/HTTP/1.1"); 
     writer.WriteLine("Host: www.google.com:80"); 
     writer.WriteLine("Connection: close"); 
     writer.WriteLine(); 
     writer.WriteLine(); 

     // Read the response from server 
     Console.WriteLine(reader.ReadToEnd()); 
    } 
} 

Otra posibilidad es activate tracing poniendo lo siguiente en su app.config y simplemente use WebClient para realizar una solicitud HTTP:

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.Net" tracemode="protocolonly"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="System.Net" value="Verbose"/> 
    </switches> 
    <sharedListeners> 
     <add name="System.Net" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="network.log" /> 
    </sharedListeners> 
    <trace autoflush="true"/> 
    </system.diagnostics> 
</configuration> 

A continuación, puede realizar una llamada HTTP:

using (var client = new WebClient()) 
{ 
    var result = client.DownloadString("http://www.google.com"); 
} 

Y, por último analizar el tráfico de red en el archivo network.log generado. WebClient también seguirá redireccionamientos HTTP.

+0

Ejemplo impresionante, estoy ansioso por probarlo. Esta es una gran manera de visualizar lo que está pasando. Gracias – Jeff

4

Use las clases WebRequest o WebResponse, según sea necesario.

Si necesita ir a un nivel inferior que estos proporcionan, consulte los otros System.Net.Sockets. * Clases de clientes como TcpClient.

2

Consulte System.Net.Sockets.TcpClient si desea escribir su propio cliente de bajo nivel. Sin embargo, para HTTP GET y POST's puede usar las clases HttpWebRequest y HttpWebResponse.

Si eres realmente masoquista podrías ir más bajo que TcpClient e implementar tu propio Socket, ver Socket class.

+0

Huy. El largo, largo camino hacia una solicitud web. –

+1

El uso de TcpClient también requeriría que comprenda el protocolo TELNET sobre el que está basado Http. –

+1

@John: ¡Otra ventaja más! –

2

En mi respuesta a esta publicación SO SharePoint 2007, how to check if a folder exists in a document library He incluido los conceptos básicos para crear HttpWebRequest y leer la respuesta.

Editar: se ha añadido un ejemplo de código del poste por encima de

System.Net.HttpWebRequest oReq; 
string sUrl = "http://yoursite/sites/somesite/DocumentLibrary"; 
oReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(sUrl); 

oReq.Method = "GET"; 
oReq.Credentials = System.Net.CredentialCache.DefaultCredentials; 
oReq.AllowAutoRedirect = true; 

//now send the request 
using (System.IO.StreamWriter oRequest = 
     new System.IO.StreamWriter(oReq.GetRequestStream())) { 
    oRequest.WriteLine(); 
} 

//and read all the response 
using (System.Net.HttpWebResponse oResponse = oReq.GetResponse()){ 
    using (System.IO.StreamReader oResponseReader = 
     new System.IO.StreamReader(oResponse.GetResponseStream())){ 
    string sResponse = oResponseReader.ReadToEnd(); 
    } 
} 
+0

-1: Faltan bloques 'using' para el StreamReader/Writer, y para la respuesta. –

+1

@ John Saunders: Sé que "usar" es un buen patrón para la codificación, sin embargo, al llamar a close() en un streamreader DOES cierra la secuencia subyacente y "libera los recursos del sistema asociados con el lector" (consulte MSDN para obtener documentación). Entonces, estás equivocado si crees que estoy leyendo algo aquí. – naivists

+0

Tiene filtraciones si algunas de las cosas intermedias arrojan una excepción. – nos

1

Use WFetch para la demostración.

En cuanto a la programación, HttpWebRequest le permite controlar un poco acerca de la solicitud - de nuevo si es para una demostración que haría uso de Wireshark para oler lo que está pasando a través del cable cuando lo hace varias tareas con el HttpWebRequest

Cuestiones relacionadas