HttpListener
должно быть хорошо, но это просто оболочка для http.sys, и эта библиотека доступна только в Windows XP и выше.
HttpPrefixes
Вам нужен только один префикс http://127.0.0.1:8080/
, потому что это только для вашего локального веб-управления. Кроме того, подстановочные знаки поддерживаются как http://*:8080/
, но в вашем случае нет причин использовать его.
Йенс Баннманн писал:
Доступ к приложениям не на localhost
, они
может быть где угодно Вот почему я не
хочу что-нибудь жестко закодировать.
что вы подразумеваете под приложениями? Вы имеете в виду сайты? это совсем другое, ваш специальный прокси-сервер будет прослушивать HttpListenerRequests на http://127.0.0.1:8080/
, и поэтому ваш веб-контроллер должен использовать прокси-сервер http://127.0.0.1:8080/
. На данный момент это все еще внутри локальной машины.
Преобразование между HttpListenerRequest / Response и HttpWebRequest / Response
Преобразуйте каждый входящий HttpListenerRequest
в HttpWebRequest
, запросите ответ, и вы получите объект HttpWebResponse
, проанализируйте, разрешен ли ответ для вашего элемента управления WebBrowser, и, если он есть, запишите его в объект HttpListnererResponse
, в противном случае напишите что-нибудь еще (состояние ошибки).
Это, вероятно, самый простой способ создать собственный прокси-сервер на .NET
Йенс Баннманн писал:
Правильно, это преобразование было тем, что я
хотел избежать необходимости делать. Или я могу
сделать это всего за несколько строк кода? От
глядя на API, выглядит больше
сложнее.
На самом деле это довольно просто, потому что протокол http тривиален. Он состоит в основном из трех частей.
- Строка запроса (содержит URL, метод http и версию http)
- Заголовки (это на самом деле то, что делает API выглядеть таким огромным и важным, но в действительности все эти свойства и методы - это всего лишь тонкий слой над необработанными заголовками http. Все, что вам нужно сделать, это скопировать все заголовки напрямую в общем случае от
HttpListenerRequest
до HttpWebRequest
. Оба класса имеют общее свойство Headers для необработанного доступа)
- Тело сообщения (просто скопируйте его содержимое, если оно есть)
Целое преобразование будет выглядеть примерно так:
HttpListenerRequest listenerRequest;
WebRequest webRequest = WebRequest.Create(listenerRequest.Url);
webRequest.Method = listenerRequest.HttpMethod;
webRequest.Headers.Add(listenerRequest.Headers);
byte[] body = new byte[listenerRequest.InputStream.Length];
listenerRequest.InputStream.Read(body, 0, body.Length);
webRequest.GetRequestStream().Write(body, 0, body.Length);
WebResponse webResponse = webRequest.GetResponse();
Если вам нужна дополнительная помощь по протоколу http, обратитесь к этой статье в википедии .
Вы также можете проверить этот проект с открытым исходным кодом для другого способа сделать это. Он не зависит от класса HttpListener
, но является полным решением для прокси-сервера, и его должно быть легко изменить для ваших нужд.