2010-04-12 12 views
6

Próbuję użyć .NET HttpListener w projekcie C#. Kiedy rejestruję swój prefiks "http: // *: 8080 /", nie działa on dla adresów URL HTTPS (tzn. Nie odbiera ich). Kiedy próbuję następujący kod do rejestracji zarówno HTTP i HTTPS wersje prefiksu jednak pojawia się błąd:.NET HttpListener: podczas rejestrowania zarówno HTTP, jak i HTTPS pojawia się "konflikt z istniejącą rejestracją na komputerze"

„Nie można słuchać na przedrostek«https: //: 8080 /», ponieważ jest ono sprzeczne ze związkiem istniejąca rejestracja na komputerze. "*

W jaki sposób mogę uzyskać mój prefiks pracujący dla obu protokołów 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 

EDIT 1 - dodatkowe wyjaśnienie:

  • Program działa jako lokalny serwer proxy dla aplikacji PC dokonywania HTTP (S) woła.
  • Sposób użycia polega więc na zmianie ustawień proxy przeglądarki tak, aby wskazywał na ten lokalny serwer proxy (np. Localhost: 8080).
  • Oznacza to (zakładam), że HttpListener musi nasłuchiwać zarówno ruchu HTTP, jak i HTTPS na tym samym porcie lokalnym (np. 8080).
  • CEL: Spróbuj znaleźć sposób, aby mój program słuchał zarówno HTTP, jak i HTTPS na tym samym porcie.

dzięki

+0

Właśnie rozpocząłem nagrodę dla kogoś, kto może dać mi przykładowy kod, który kompiluje i działa, co pozwala słuchać zarówno HTTP, jak i HTTPS na tym samym porcie. – Greg

Odpowiedz

8

OBJECTIVE: Try to find a way for my program to listen to both HTTP and HTTPS on the same port.

Ty nie można to zrobić z HttpListener. Będziesz musiał użyć TCPListener i traktować każdą odpowiedź warunkowo w zależności od tego, czy jest to HTTP czy HTTPS.

Jestem pewien, że jeśli użyjesz jednego HTTPListenera dla HTTP 8080 i jednego dla HTTPS 8443, powinieneś móc sprawić, że twoja przeglądarka będzie używać twojego proxy: 8080 dla HTTP i yourproxy: 8443 dla HTTPS. Firefox zdecydowanie pozwala ci to zrobić.

3

Domyślnie https przy użyciu portu 443 zamiast 80. musisz określić inny port na inny protokół Lister.

+0

, ale kiedy skonfigurować przeglądarkę, aby przejść przez ten lokalny "proxy" buduję Zakładam, że muszę tylko określić jeden host/port nie? Jak zwykle w przeglądarkach masz tylko jeden port dla serwera proxy? – Greg

2

To nie brzmi banalnie, ale nie jest niemożliwe. Będziesz musiał sprawdzić, co wysyła klient i zdecydować, czy rozpoczynają sesję HTTP lub HTTPS na podstawie dostarczanych danych.

edytuj: Myślenie o tym trochę więcej prawdopodobnie nie jest tym, co chcesz zrobić, ponieważ piszesz proxy. Zamiast tego będziesz musiał obsłużyć metodę CONNECT (patrz http://www.ietf.org/rfc/rfc2817.txt) i otworzyć tunelowane połączenie z serwerem docelowym.

0

Nie musisz używać tej samej konfiguracji dla wszystkich protokołów.

Udoskonal zaawansowane ustawienia proxy i tam możesz określić różne ustawienia proxy dla innych protokołów.

+0

zrozumiałe - ale nie musisz tego robić, aby przejść przez normalny serwer proxy firmy, więc chcę, aby mój domowy mógł pracować w tym samym zakresie. – Greg

2

"Jeśli utworzysz HttpListener za pomocą protokołu HTTPS, musisz wybrać certyfikat serwera dla tego obiektu nasłuchującego. W przeciwnym razie zapytanie HttpWebRequest o tym HttpListener zakończy się niepowodzeniem z nieoczekiwanym zamknięciem połączenia." To jest z witryny msdn.(http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx) Może jest problem?

Powiązane problemy