.NET HTTPListener: Ao registrar os dois http e https, recebo “conflitos com um registro existente na máquina”

StackOverflow https://stackoverflow.com/questions/2619251

  •  26-09-2019
  •  | 
  •  

Pergunta

Estou tentando usar o .NET httPlistener em um projeto C#. Quando registro meu prefixo "http: //*: 8080/", ele não parece funcionar para URLs HTTPS (ou seja, não os pega). Quando tento o código a seguir para registrar as versões HTTP e HTTPS do prefixo, no entanto, recebo o erro:

"Falha ao ouvir no prefixo 'https: //: 8080/'Porque conflita com um registro existente na máquina. "*

Como posso fazer meu prefixo funcionar para HTTP e 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

Editar 1 - esclarecimento adicional:

  • O programa está funcionando como proxy local para aplicativos para PC que fazem chamadas (s) HTTP (s).
  • O uso é, portanto, baseado na alteração das configurações de proxy do navegador para apontar para este servidor proxy cultivado em casa local (por exemplo, localhost: 8080)
  • Portanto, isso implica (suponho) que o httplistener precisa ouvir o tráfego HTTP e HTTPS nessa mesma porta local (por exemplo, 8080).
  • Objetivo: Tente encontrar uma maneira de meu programa ouvir HTTP e HTTPS na mesma porta.

obrigado

Foi útil?

Solução

Objetivo: tente encontrar uma maneira de meu programa ouvir HTTP e HTTPS na mesma porta.

Você não pode Faça isso com httplistener. Você precisará usar um TcPlistener e manuseie cada resposta condicionalmente, dependendo se é HTTP ou HTTPS.

Tenho certeza de que, se você usar um HTTPListener para HTTP 8080 e um para HTTPS 8443, poderá fazer com que seu navegador use o seu proxy: 8080 para HTTP e YourProxy: 8443 para https. Firefox definitivamente vamos fazer isso.

Outras dicas

Por padrão, https usando a porta 443 em vez de 80. Você deve especificar uma porta diferente para diferentes protocolo.

Isso parece não trivial, mas não impossível. Você precisará inspecionar o que o cliente envia e decidir se está iniciando uma sessão HTTP ou HTTPS com base nos dados que eles fornecem.

EDIT: Pensando sobre isso um pouco mais, provavelmente não é o que você deseja fazer, já que está escrevendo um proxy. Em vez disso, você precisará lidar com o método de conexão (veja http://www.ietf.org/rfc/rfc2817.txt) e abra uma conexão túnel com o servidor de destino.

"Se você criar um HTTPListener usando HTTPS, deverá selecionar um certificado de servidor para esse ouvinte. Caso contrário, uma consulta httpwebrequest deste httplistener falhará com um fechamento inesperado da conexão". Isto é do site MSDN. (http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx) Talvez o problema exista?

Você não é forçado a usar a mesma configuração para todos os protocolos.

Pressione Advanced nas configurações de proxy e lá você pode especificar diferentes configurações de proxy para outros protocolos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top