Как создать класс .NET HttpWebRequest из полученного байта сокета [] - PullRequest
6 голосов
/ 09 июня 2009

У меня есть сокет, который получает HTTP-запросы.

Итак, у меня есть необработанный http-запрос в виде байта [] из моего сокета.

Я должен изучить этот запрос - НО

Вместо изобретения колеса - могу ли я «привести» этот байтовый массив в System.Net.HttpWebRequest или что-то подобное?

----- ОБНОВЛЕНИЕ ---------

Так что в любом случае я не мог найти ответ. Копая немного дальше, хотя я думаю, что это можно сделать, вызвав функции в:

HttpApi.dll Я думаю, что HttpWebRequest использует эту dll (winxpsp2)

интересная структура 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;

Я только начал C #, поэтому углубился в ?? COM ?? программирование у меня над головой.

И, просматривая дукументацию, я не вижу «записи» (под которой я подразумеваю простую передачу байтов-> получение HTTP_REQUEST).

Anyhoo! если кто-нибудь захочет указать мне какой-нибудь замечательный HTTP-сервер WINDOWS KERNEL MODE, включающий SSL, то не стесняйтесь, это будет отличное чтение и что-то, что стоит рассмотреть в будущем.

Ответы [ 3 ]

15 голосов
/ 14 июня 2009

просто замените Socket с помощью HttpListener . Он легко разбирает HTTP-запрос.

Вот пример:

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
}
6 голосов
/ 09 июня 2009

Рассматривали ли вы использование класса HttpListener вместо сокета для получения входящих HTTP-запросов? Это даст HttpListenerRequest объекты вместо необработанных данных. Я нашел эти классы полезными для имитации веб-сервера.

3 голосов
/ 09 июня 2009

Вы не можете привести его к HttpWebRequest или что-то в этом роде. Просто выбросьте Socket и используйте HttpWebRequest. В противном случае вам придется вручную разобрать ответ byte[].

...