.NET HttpListener: when registering both HTTP & HTTPS I get "conflicts with an existing registration on the machine"

Greg picture Greg · Apr 12, 2010 · Viewed 9.5k times · Source

I'm trying to use .NET HttpListener in a C# project. When I register my prefix "http://*:8080/" it does not seem to work for HTTPS urls (i.e. doesn't pick them up). When I try the following code to register both the HTTP and HTTPS versions of the prefix however I get the error:

"Failed to listen on prefix 'https://:8080/' because it conflicts with an existing registration on the machine."*

How can I get my prefix working for both 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 - Additional clarification:

  • The program is working as a local proxy for PC applications making HTTP(S) calls out.
  • Usage is therefore based on changing one's browser proxy settings to point to this local home grown proxy server (e.g. localhost:8080)
  • This implies therefore (I assume) that the HttpListener has to listen for both HTTP and HTTPS traffic on this same local port (e.g. 8080).
  • OBJECTIVE: Try to find a way for my program to listen to both HTTP and HTTPS on the same port.

thanks

Answer

anger picture anger · Apr 20, 2010

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

You can't do this with HTTPListener. You'll need to use a TCPListener and handle each response conditionally depending on whether it is HTTP or HTTPS.

I'm pretty sure if you use one HTTPListener for HTTP 8080 and one for HTTPS 8443 you should be able to make your browser use yourproxy:8080 for HTTP and yourproxy:8443 for HTTPS. Firefox definitely let's you do this.