2009-06-09 4 views
5

Ho un socket che sta ricevendo richieste HTTP.Come creare una classe HttpWebRequest .NET da un byte ricevuto Socket []

Quindi ho una richiesta http grezza in byte [] dal mio socket.

devo studiare questa richiesta - MA

Invece di reinventare la ruota - posso 'cast' questo array di byte in uno System.Net.HttpWebRequest o qualcosa di simile?

UPDATE ----- ---------

Quindi, comunque non ho potuto trovare la risposta. Scavando un po 'più se penso che potrebbe essere fatto da funzioni chiamando in:

Httpapi.dll Penso che il HttpWebRequest utilizza questa DLL (WinXPSP2)

la struttura interessante è il HTTP_REQUEST

C++ 
typedef struct _HTTP_REQUEST { 
    ULONG     Flags; 
    HTTP_CONNECTION_ID  ConnectionId; 
    HTTP_REQUEST_ID  RequestId; 
    HTTP_URL_CONTEXT  UrlContext; 
    HTTP_VERSION   Version; 
    HTTP_VERB    Verb; 
    USHORT     UnknownVerbLength; 
    USHORT     RawUrlLength; 
    PCSTR     pUnknownVerb; 
    PCSTR     pRawUrl; 
    HTTP_COOKED_URL  CookedUrl; 
    HTTP_TRANSPORT_ADDRESS Address; 
    HTTP_REQUEST_HEADERS Headers; 
    ULONGLONG    BytesReceived; 
    USHORT     EntityChunkCount; 
    PHTTP_DATA_CHUNK  pEntityChunks; 
    HTTP_RAW_CONNECTION_ID RawConnectionId; 
    PHTTP_SSL_INFO   pSslInfo; 
}HTTP_REQUEST_V1, *PHTTP_REQUEST_V1; 

Ho appena iniziato C# così scavando in COM ?? la programmazione è finita.

E guardando attraverso la documentazione, non vedo una "voce" (con la quale intendo un semplice byte di invio-> ricevi HTTP_REQUEST).

Anyhoo! se qualcuno vuole indicarmi la direzione di alcuni simpatici SERVI HTTP KERNEL MODE WINDOWS INCLUSI SSL, allora sentitevi liberi sarebbe un'ottima lettura e qualcosa da considerare per il futuro.

+0

comprendo che smusso 'gettato' nel senso tradizionale tecnico /, ma riflette la classe HttpWebRequest e presentante un poke sembra che il HttpWebRequest viene analizzato/creato dalla SerializationInfo di WebRequest? troppo sopra la mia testa:/ – divinci

+0

Domande simili - http://stackoverflow.com/questions/318506/converting-raw-http-request-into-httpwebrequest-object - http://stackoverflow.com/questions/743794/net -http-parser –

risposta

15

è sufficiente sostituire la presa utilizzando HttpListener. Analizza la richiesta HTTP per te, facilmente.

Ecco un esempio:

HttpListener listener = new HttpListener(); 
// prefix URL at which the listener will listen 
listener.Prefixes.Add("http://localhost:8080/"); 
listener.Start(); 
Console.WriteLine("Listening..."); 
while (true) 
{ 
    // the GetContext method blocks while waiting for a request. 
    HttpListenerContext context = listener.GetContext(); 
    HttpListenerRequest request = context.Request; 

    // process the request 
    // if you want to process request from multiple clients 
    // concurrently, use ThreadPool to run code following from here 
    Console.WriteLine("Client IP " + request.UserHostAddress); 

    // in request.InputStream you have the data client sent 
    // use context.Response to respond to client 
} 
+0

non è la risposta: / – divinci

3

Non è possibile trasmettere a HttpWebRequest o qualcosa del genere. Basta buttare via lo Socket e usare invece HttpWebRequest. In caso contrario, dovrai analizzare manualmente la risposta byte[].

6

Hai considerato di utilizzare la classe HttpListener invece di un socket per ricevere le richieste HTTP in arrivo? Produrrà oggetti HttpListenerRequest invece di dati non elaborati. Ho trovato queste classi utili per la simulazione di un server web.