Как реализовать собственный прокси-сервер? - PullRequest
2 голосов
/ 03 февраля 2009

В конечном итоге я хочу заблокировать загрузки в .NET WebBrowser control , фактически ограничивая его отображением HTML, изображений, сценариев и т. П., Но никогда ever не отображать "Сохранить как "диалог с пользователем.

Решение, предложенное в ответе на этот вопрос, состояло в том, чтобы подключить собственный прокси-сервер, который проверяет ответы и отфильтровывает все, что приведет к приглашению на загрузку. Как я могу реализовать такой прокси в моем приложении .NET? Я не хочу устанавливать стороннее программное обеспечение или библиотеки.

Я нашел класс HttpListener , но у меня есть две проблемы с ним:

  1. Слушателю требуется предопределенный набор префиксов, запускающих его. Однако я бы предпочел не жестко кодировать имена хостов или номера портов в моем приложении и использовать их как общие.
  2. Я должен был бы реализовать код, который выполняет фактический запрос сам - разве нет чего-то, что делает это для меня, где я могу просто нажать на строку, исследуя содержимое ответа и изменяя их как необходимые (например, фильтр запросов в J2EE делает на стороне сервера)?

Обновление

Ладно, думаю, мне нужно прояснить ситуацию: мое приложение .NET (многофункциональный клиент) используется во многих проектах, в которых также есть веб-приложения. Приложение .NET включает в себя универсальную форму многократного использования с элементом управления WebBrowser. Другие разработчики используют эту форму для интеграции доступа к своим веб-приложениям в приложение .NET.

Я хочу заблокировать загрузку, поэтому я хочу, чтобы форма WebBrowser перехватывала весь трафик и не вызывала диалоговое окно «Сохранить как». Таким образом ...

  • Я не знаю, какие имена хостов будут
  • Веб-браузер указывает на реальные URL-адреса, пользователь щелкает обычные ссылки, запускает JavaScript ... все это обслуживается веб-приложением
  • Если бы WebBrowser указывал на localhost (как предложено), мне пришлось бы анализировать ответы и переписывать все ссылки, чтобы они снова указывали на localhost, сохраняя исходный URL. Я не хочу проходить через эту стычку.

Ответы [ 2 ]

5 голосов
/ 03 февраля 2009

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, но является полным решением для прокси-сервера, и его должно быть легко изменить для ваших нужд.

0 голосов
/ 03 февраля 2009

Возможно прокси с открытым исходным кодом?

http://www.mentalis.org/soft/projects/proxy/

...