听取浏览器的请求

时间:2014-01-09 19:36:37

标签: c# .net http httplistener

使用以下代码:

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 /',因为它与a冲突   现有的机器注册。

那么我该如何收听浏览器的请求?

6 个答案:

答案 0 :(得分:4)

  

@ 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);
            }
        });
}

答案 1 :(得分:1)

这个端口可能正在使用...... 在命令行上运行netstat -ano,您将看到正在使用的端口列表及其进程ID。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

  

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

有关详细信息,请参阅:https://msdn.microsoft.com/en-us/library/system.net.httplistener.getcontext(v=vs.110).aspx

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

答案 5 :(得分:0)

使用*

替换前缀中的+
listener.Prefixes.Add("http://+:8080/");