如何在C#中创build一个简单的代理?

我已经在几个星期前下载了Privoxy,为了好玩,我很好奇,知道它的简单版本可以做什么。

我明白,我需要configuration浏览器(客户端)发送请求到代理。 代理将请求发送到networking(假设它是一个http代理)。 代理将收到答案…但代理如何将请求发送回浏览器(客户端)?

我在网上search了C#和http代理,但还没有find让我明白它是如何正确地在场景后面工作的。 (我相信我不想要反向代理,但我不确定)。

你们有没有一些解释或一些信息让我继续这个小项目?

更新

这是我的理解(见下图)。

步骤1我configuration客户端(浏览器)的所有请求发送到端口代理侦听127.0.0.1。 这样,请求将不会直接发送到Internet,而是由代理处理。

步骤2代理看到一个新的连接,读取HTTP头,看到他必须执行的请求。 他执行请求。

Step3代理从请求接收答案。 现在,他必须把答案从networking发送到客户端,但如何?

替代文字

有用的链接

Mentalis代理 :我发现这个项目是一个代理(但更多,我想)。 我可能会检查来源,但我真的想要一些基本的东西来理解更多的概念。

ASP Proxy :我也可以在这里获得一些信息。

请求reflection器 :这是一个简单的例子。

这是一个简单的Http代理Git中心库 。

您可以使用HttpListener类来构build一个侦听传入的请求,并使用HttpWebRequest类来中继请求。

我不会使用HttpListener或类似的东西,这样你会遇到很多问题。

最重要的是这将是一个巨大的痛苦,以支持:

  • 代理保持活动
  • SSL将无法工作(以正确的方式,你会得到popup窗口)
  • .NET库严格遵循RFC,导致一些请求失败(尽pipeIE,FF和世界上任何其他浏览器都能正常工作)。

你需要做的是:

  • 听一个TCP端口
  • parsing浏览器请求
  • 提取主机在TCP级别连接到该主机
  • 一切来回,除非你想添加自定义标题等

我用.NET编写了2个不同的HTTP代理,具有不同的需求,我可以告诉你这是最好的方法。

Mentalis这样做,但他们的代码是“代表意大利面”,比GoTo更糟:)

代理可以按照以下方式工作。

步骤1,configuration客户端使用proxyHost:proxyPort。

Proxy是在proxyHost上监听的TCP服务器:proxyPort。 浏览器打开与代理的连接并发送Http请求。 代理分析此请求并尝试检测“主机”标题。 这个头将告诉代理在哪里打开连接。

第2步:代理服务器打开连接到“主机”标题中指定的地址。 然后它将HTTP请求发送到该远程服务器。 阅读回复。

步骤3:在从远程HTTP服务器读取响应之后,代理通过先前打开的与浏览器的TCP连接发送响应。

示意图看起来像这样:

 Browser Proxy HTTP server Open TCP connection Send HTTP request -----------> Read HTTP header detect Host header Send request to HTTP -----------> Server <----------- Read response and send <----------- it back to the browser Render content 

我最近使用TcpListener和TcpClient在c#.net中编写了一个轻量级代理。

https://github.com/titanium007/Titanium-Web-Proxy

它支持安全的HTTP正确的方式,客户机需要信任代理使用的根证书。 还支持WebSockets中继。 支持HTTP 1.1的所有function,除了stream水线。 stream水线大多数现代浏览器都不使用。 还支持Windows身份validation(普通,摘要)。

您可以通过引用项目来连接您的应用程序,然后查看和修改所有stream量。 (请求和响应)。

就性能而言,我已经在我的机器上testing过了,并且没有任何明显的延迟。

如果你只是想拦截stream量,你可以使用提琴手核心创build一个代理…

http://fiddler.wikidot.com/fiddlercore

首先使用UI运行Fiddler来查看它的function,它是一个允许您debugginghttp / httpsstream量的代理。 它是用C#编写的,有一个核心,你可以在你自己的应用程序中构build。

请记住FiddlerCore不适用于商业应用。

OWIN和WebAPI使事情变得非常简单。 在我的C#代理服务器的search,我也遇到这个posthttp://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ 。 这将是我正在采取的道路。

同意邪恶的,如果你使用HTTPListener你会有很多问题,你必须parsing请求,将参与标题和…

  1. 使用tcp侦听器来侦听浏览器请求
  2. 只parsing请求的第一行,并获得主机域和端口连接
  3. 在浏览器请求的第一行发送确切的原始请求到find的主机
  4. 从目标网站接收数据(本节中有问题)
  5. 将从主机收到的确切数据发送到浏览器

你看到你不需要甚至知道什么是在浏览器请求和parsing它,只有从第一行第一行得到目标网站地址通常喜欢这个GET http://google.com HTTP1.1或CONNECT facebook.com: 443(这是针对ssl请求的)

Socks4是一个非常简单的协议来实现。 您监听初始连接,连接到客户端请求的主机/端口,将成功代码发送到客户端,然后通过套接字转发传出和传入stream。

如果你使用HTTP,你将不得不阅读,并可能设置/删除一些HTTP头,这是多一点工作。

如果我没有记错,SSL将在HTTP和Socks代理上工作。 对于一个HTTP代理,你实现了CONNECT谓词,和上面描述的socks4非常相似,然后客户端在被代理的tcpstream上打开SSL连接。

浏览器连接到代理,所以代理从Web服务器获得的数据只是通过浏览器启动到代理的相同连接发送的。

我也为asp.net / web api写了一个简单而强大的反向代理。

你可以在这里find它: https : //github.com/SharpTools/SharpReverseProxy

只需通过nuget添加到您的项目,你很好去。 您甚至可以即时修改请求,响应或拒绝由于身份validation失败而导致的转发。

看看源代码,这是很容易实现:)