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

Pat*_*ins 139 .net c# proxy .net-2.0

几个星期前我已经下载了Privoxy,为了好玩,我很想知道它的简单版本是如何完成的.

我知道我需要配置浏览器(客户端)以向代理发送请求.代理将请求发送到Web(假设它是一个http代理).代理将收到答案......但代理如何将请求发送回浏览器(客户端)?

我在网上搜索了C#和http代理,但是没有找到让我理解它在幕后正确工作的东西.(我相信我不想要反向代理,但我不确定).

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

更新

这就是我的理解(见下图).

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

步骤2代理查看新连接,读取HTTP标头并查看必须执行的请求.他执行请求.

步骤3代理从请求中接收答案.现在他必须从网上发送答案给客户但是怎么样???

替代文字

有用的链接

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

ASP代理:我也许可以在这里获得一些信息.

请求反射器:这是一个简单的例子.

这是一个带有简单Http代理Git Hub存储库.

dr.*_*vil 88

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

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

  • 代理保持活力
  • SSL将无法正常工作(以正确的方式,您将获得弹出窗口)
  • .NET库严格遵循RFC,导致某些请求失败(即使IE,FF和世界上任何其他浏览器都能正常工作.)

你需要做的是:

  • 侦听TCP端口
  • 解析浏览器请求
  • 提取主机以TCP级别连接到该主机
  • 除非您想要添加自定义标题等,否则来回转发所有内容.

我在.NET中编写了2个不同的HTTP代理,它们有不同的要求,我可以告诉你,这是最好的方法.

Mentalis这样做,但他们的代码是"委托意大利面条",比GoTo更差:)

  • 使用SSL的@Restuta你应该转发连接,而​​不是在TCP级别实际触摸它,HttpListener不能这样做.您可以阅读SSL的工作原理,您将看到它需要对目标服务器进行身份验证.因此,客户端会尝试连接到https://google.com,但实际上会连接您的Httplistener而非https://google.com并且会出现证书不匹配错误,并且由于您的侦听器不会使用已签名的证书,因此获取不正确的证书等.您可以通过将CA安装到客户端将使用的计算机来修复它.这是一个非常肮脏的解决方案. (10认同)
  • @cameron TCPListener和SslStream. (8认同)
  • 您能否分享一下为什么HTTPS不起作用的经验? (2认同)

Mar*_*ade 33

您可以使用HttpListener类构建一个用于侦听传入请求,并使用HttpWebRequest类来中继请求.

  • 我不会为此使用HttpListener.相反,构建一个ASP.NET应用程序并在IIS中托管它.使用HttpListener时,您放弃了IIS提供的流程模型.这意味着您将丢失诸如进程管理(启动,故障检测,回收),线程池管理等内容. (7认同)
  • 如果您正在使用HttpListener,则只需将响应写入HttpListener.GetContext().Response.OutputStream.无需关心地址. (2认同)
  • 也就是说,如果你打算将它用于许多客户端计算机...对于玩具代理,HttpListener可以...... (2认同)
  • both methods are now obsolete... Any updates? (2认同)

jus*_*121 23

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

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

它以正确的方式支持安全HTTP,客户端机器需要信任代理使用的根证书.还支持WebSockets中继.除流水线外,支持HTTP 1.1的所有功能.大多数现代浏览器都不使用流水线技术.还支持Windows身份验证(普通,摘要).

您可以通过引用项目来连接应用程序,然后查看和修改所有流量.(要求和回应).

就性能而言,我已经在我的机器上进行了测试,并且没有任何明显的延迟.

  • 2020年仍然保持,感谢分享:) (2认同)

Vad*_*iak 19

代理可以按以下方式工作.

Step1,配置客户端使用proxyHost:proxyPort.

Proxy是一个正在侦听proxyHost:proxyPort的TCP服务器.浏览器打开与Proxy的连接并发送Http请求.代理解析此请求并尝试检测"主机"标头.此标头将告知Proxy在何处打开连接.

步骤2:代理打开与"主机"标头中指定的地址的连接.然后它将HTTP请求发送到该远程服务器.阅读回复.

步骤3:从远程HTTP服务器读取响应后,Proxy通过先前打开的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
Run Code Online (Sandbox Code Playgroud)


Dea*_*rth 14

如果您只是想拦截流量,可以使用fiddler核心来创建代理......

http://fiddler.wikidot.com/fiddlercore

首先使用UI运行fiddler以查看它的功能,它是一个允许您调试http/https流量的代理.它是用c#编写的,并且有一个可以构建到自己的应用程序中的核心.

请记住,FiddlerCore不适用于商业应用程序.


Joc*_*ick 6

OWIN和WebAPI让事情变得非常简单.在我搜索C#代理服务器时,我也发现了这篇文章http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/.这将是我正在走的路.


Ali*_*nan 5

如果你使用HTTPListener同意邪恶,你会有很多问题,你必须解析请求,并将参与标题和...

  1. 使用tcp listener来监听浏览器请求
  2. 仅解析请求的第一行并获取要连接的主机域和端口
  3. 在浏览器请求的第一行上将确切的原始请求发送到找到的主机
  4. 从目标站点接收数据(我在本节中有问题)
  5. 将从主机收到的确切数据发送到浏览器

你看到你甚至不需要知道浏览器请求中的内容并解析它,只从第一行得到目标站点地址第一行通常喜欢这个GET http://google.com HTTP1.1或CONNECT facebook.com: 443(这是针对ssl请求)


C.M*_*.M. 5

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

如果你使用 HTTP,你将不得不阅读并可能设置/删除一些 HTTP 标头,这样就需要做更多的工作。

如果我没记错的话,SSL 可以跨 HTTP 和 Socks 代理工作。对于 HTTP 代理,您实现 CONNECT 动词,其工作方式与上述的 socks4 非常相似,然后客户端通过代理的 tcp 流打开 SSL 连接。