.NET HttpListener: при регистрации HTTP и HTTPS я получаю «конфликт с существующей регистрацией на машине» - PullRequest
6 голосов
/ 12 апреля 2010

Я пытаюсь использовать .NET HttpListener в проекте C #. Когда я регистрирую свой префикс "http://*:8080/", кажется, что он не работает для URL-адресов HTTPS (то есть не забирает их). Когда я пытаюсь следующий код зарегистрировать обе версии префикса HTTP и HTTPS, я получаю сообщение об ошибке :

"Не удалось прослушать префикс" https://:8080/', поскольку он конфликтует с существующей регистрацией на компьютере. "*

Как заставить мой префикс работать как для HTTP, так и для HTTPS?

    private HttpListener _listener;

    // Create prefixes
    var prefixes = new List<string>();
    prefixes.Add("http://*:8080/");
    prefixes.Add("https://*:8080/");


    // Create HttpListener
    _listener = new HttpListener();
    foreach (string prefix in prefixes)
    {
        _listener.Prefixes.Add(prefix);
    }

    _listener.Start();   // <== ERROR HERE

РЕДАКТИРОВАТЬ 1 - Дополнительные разъяснения:

  • Программа работает в качестве локального прокси-сервера для приложений ПК, выполняющих вызовы HTTP (S).
  • Таким образом, использование основано на изменении настроек прокси-сервера браузера для указания на этот локальный домашний прокси-сервер (например, localhost: 8080)
  • Следовательно, это подразумевает (я предполагаю), что HttpListener должен прослушивать как HTTP, так и HTTPS-трафик на одном и том же локальном порту (например, 8080).
  • ЦЕЛЬ: Попробуйте найти способ для моей программы прослушивать HTTP и HTTPS на одном и том же порту .

спасибо

Ответы [ 5 ]

8 голосов
/ 20 апреля 2010

ЦЕЛЬ: Попробуйте найти способ для моего программа для прослушивания как HTTP, так и HTTPS на тот же порт.

Вы не можете сделать это с помощью HTTPListener. Вам нужно будет использовать TCPListener и обрабатывать каждый ответ условно в зависимости от того, HTTP это или HTTPS.

Я уверен, что если вы используете один HTTPListener для HTTP 8080 и один для HTTPS 8443, вы сможете настроить свой браузер на использование вашего proxy: 8080 для HTTP и вашего proxy: 8443 для HTTPS. Firefox определенно позволит вам сделать это.

3 голосов
/ 12 апреля 2010

По умолчанию https использует порт 443, а не 80. Необходимо указать другой порт для другого списка протоколов.

2 голосов
/ 18 августа 2011

«Если вы создаете HttpListener с использованием https, вы должны выбрать сертификат сервера для этого слушателя. В противном случае запрос HttpWebRequest этого HttpListener завершится неудачно с неожиданным закрытием соединения». Это с сайта MSDN. (http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx) Может проблема в этом?

2 голосов
/ 14 апреля 2010

Это звучит нетривиально, но не невозможно. Вам нужно будет проверить, что отправляет клиент, и решить, запускают ли они сеанс HTTP или HTTPS, на основе данных, которые они предоставляют.

edit: Думая об этом немного больше, это, вероятно, не то, что вы хотите сделать, учитывая, что вы пишете прокси. Вместо этого вам потребуется обработать метод CONNECT (см. http://www.ietf.org/rfc/rfc2817.txt) и открыть туннельное соединение с целевым сервером.

0 голосов
/ 16 апреля 2010

Вы не обязаны использовать одну и ту же конфигурацию для всех протоколов.

Хит продвинутый в настройках прокси, и там вы можете указать другие настройки прокси для других протоколов.

...