.NET HttpListener:当同时注册HTTP和HTTPS时,我遇到“与机器上现有注册冲突”的问题。

7
我正在尝试在C#项目中使用.NET HttpListener。当我注册前缀"http://*:8080/"时,它似乎无法处理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 - 额外澄清:

  • 该程序作为本地代理,用于PC应用程序发出的HTTP(S)调用。
  • 因此,使用基于更改浏览器代理设置来指向此本地自制代理服务器(例如localhost:8080)的方法。
  • 这意味着(我假设)HttpListener必须在同一本地端口(例如8080)上同时监听HTTP和HTTPS流量。
  • 目标:尝试找到一种方法使我的程序在同一端口上监听HTTP和HTTPS

谢谢


刚刚开始了一项悬赏,寻求能够提供编译并且能够监听HTTP和HTTPS协议的同一端口的范例代码。 - Greg
5个回答

8
目标:尝试找到一种方法,让我的程序在同一个端口上同时监听HTTP和HTTPS。
使用HTTPListener是不行的。您需要使用TCPListener,并根据响应是否为HTTP或HTTPS有条件地处理每个响应。
我非常确定,如果您在HTTP 8080上使用一个HTTPListener,在HTTPS 8443上使用另一个HTTPListener,您应该能够使浏览器使用yourproxy:8080来进行HTTP请求,使用yourproxy:8443来进行HTTPS请求。Firefox绝对可以做到这一点。

3

默认情况下,使用https时使用的端口是443而不是80。您必须为不同的协议列表指定不同的端口。


但是当我配置我的浏览器通过这个本地“代理”时,我假设我只需要指定一个主机/端口号码?就像通常使用浏览器时,您只需为代理服务器指定一个端口一样? - Greg

3

2
这听起来不太简单,但也不是不可能。您需要检查客户端发送的数据,并根据它们提供的数据决定它们是否启动了HTTP或HTTPS会话。
编辑:再考虑一下,鉴于您正在编写代理,这可能不是您想要做的事情。相反,您将需要处理CONNECT方法(请参见http://www.ietf.org/rfc/rfc2817.txt),并打开到目标服务器的隧道连接。

0

您不必强制使用相同的配置来处理所有协议。

在代理设置中点击高级选项,您可以为其他协议指定不同的代理设置。


明白了 - 但是你不需要这样做来通过一个普通的公司代理服务器,所以我希望我的自制代理服务器能够在同样的情况下工作。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接