【问题标题】:Listen to Browser's requests监听浏览器的请求
【发布时间】:2014-01-28 13:16:56
【问题描述】:

使用以下代码:

HttpListener listener = new HttpListener();
//listener.Prefixes.Add("http://*:80/");
listener.Prefixes.Add("http://*:8080/");
listener.Prefixes.Add("http://*:8081/");
listener.Prefixes.Add("http://*:8082/");
listener.Start();
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;

尽管在 IE 和 Firefox 中加载了 http(不是 https)页面,但程序仍挂在 GetContext();

当我取消注释第一行时,我得到了错误:

未能侦听前缀“http://*:80/”,因为它与 机器上的现有注册。

那么如何监听浏览器的请求呢?

【问题讨论】:

  • 你在运行另一个网络服务器……还是 Skype?
  • @minitech 什么都没有。简单的 Windows 7,没有网络内容。 (当然,Visual Studio 正在运行。)
  • 你需要一个代理,fiddler2.comfiddler2.com/fiddlercore
  • 您在浏览器中输入的网址是什么? HttpListener 不会拦截对其他站点的请求,它只是处理指向它的请求。
  • 你在你的机器上的 80 端口上运行任何东西吗?你能telnet到80端口吗?

标签: c# .net http httplistener


【解决方案1】:

我不知道为什么GetContext(); 挂起,因为关于listerner 变量发生了什么的信息太少了,但是端口80 的问题通常是由Skype 引起的,因为它默认使用端口80。要解决此问题,请打开 Skype 的首选项,转到高级-> 连接并取消选中“使用端口 80 和 443 作为传入连接的替代选项”。

【讨论】:

  • minitech 是唯一提到“skype”的人。 OP说他没有。
【解决方案2】:

这个端口可能正在被使用... 在命令行上运行 netstat -ano,你会看到正在使用的端口列表和它们的进程 ID。

【讨论】:

  • 我查了Resource Monitor - Listening Ports,什么也没有。
  • 好的。我按照您所说的进行了检查,并使用了 PID 和“进程资源管理器”——它是 Firefox。但这正是我的意思——我需要 Firefox 用来监听它的端口。
  • 尝试杀死进程,运行你的代码,然后再次启动firefox
  • 谢谢。但这无济于事。
  • 我发现 iis 正在监听它。所以现在它使用80 运行。但仍然挂在HttpListenerContext context = listener.GetContext();
【解决方案3】:

@L.B 我想写一个“代理”

不要重新发明轮子,只需使用FiddlerCore

public class HttpProxy : IDisposable
{
    public HttpProxy()
    {
        Fiddler.FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;
        Fiddler.FiddlerApplication.Startup(8764, true, true);
    }

    void FiddlerApplication_BeforeRequest(Fiddler.Session oSession)
    {
        Console.WriteLine(String.Format("REQ: {0}", oSession.url));
    }

    public void Dispose()
    {
        Fiddler.FiddlerApplication.Shutdown();
    }
}

编辑

你可以从这个矩形轮子开始:)

void SniffPort80()
{
    byte[] input = new byte[] { 1 };
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
    socket.Bind(new IPEndPoint(IPAddress.Broadcast, 80));
    socket.IOControl(IOControlCode.ReceiveAll, input, null);

    byte[] buffer = new byte[0x10000];

    Task.Factory.StartNew(() =>
        {
            while (true)
            {
                int len = socket.Receive(buffer);
                if (len <= 40) continue; //Poor man's check for TCP payload
                string bin = Encoding.UTF8.GetString(buffer, 0, len); //Don't trust to this line. Encoding may be different :) even it can contain binary data like images, videos etc.
                Console.WriteLine(bin);
            }
        });
}

【讨论】:

  • 不。我需要自己写。这就是问题的重点。
  • 我开始这个是因为我之前的问题 stackoverflow.com/questions/21027462/… 的 cmets 并且是在我关于主题 stackoverflow.com/questions/21021715/create-browser-vpn 的第一个问题之后。我希望有人能指出我正确的方向,而不是浪费我这么多时间......
  • 那么我从哪里开始呢? TcpClient?我现在想要的只是通过监听浏览器的流量来获取浏览器发送的 url。我什至不在乎这是否意味着请求将失败。 任何东西。.
  • @ispiro:听起来您需要从头开始,通过了解 TCP/IP。我建议您从TcpClient 开始,并了解一些使用它的简单示例应用程序。编写代理远远超出了您目前的水平。
  • @ispiro 我可以发布一个读取端口 80 的所有数据的代码,但这些将是 all tcp/http 会话的原始字节。您将不得不对它们进行多路分解。我认为这不是一个简单的过程(需要深入了解 TCP 和 HTTP(s))
【解决方案4】:

我会考虑研究这个包http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OwinSelfHost/ 它在后台使用 HttpListener 并使用 WebApi HttpMessageHandler 创建代理非常容易。

【讨论】:

    【解决方案5】:

    它挂起是因为 GetContext() 正在等待接收请求,如其文档中所述:

    此方法在等待传入请求时阻塞。如果您希望异步处理传入请求(在单独的线程上)以便您的应用程序不会阻塞,请使用 BeginGetContext 方法。

    欲了解更多信息,请参阅:https://msdn.microsoft.com/en-us/library/system.net.httplistener.getcontext(v=vs.110).aspx

    使用异步模型往往很复杂,另一种选择是在不同的线程中运行所有代码,但这取决于您的目标。

    【讨论】:

      【解决方案6】:

      将前缀中的* 替换为+

      listener.Prefixes.Add("http://+:8080/");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 2014-06-26
        • 2022-11-28
        • 1970-01-01
        • 2018-01-17
        • 2017-08-01
        相关资源
        最近更新 更多