如何实现自定义代理服务器?

时间:2009-02-03 11:08:32

标签: .net proxy filter browser response

最终,我希望block downloads in .NET WebBrowser control,有效地限制它显示HTML,图像,脚本等,但从来没有永远向用户显示“另存为”对话框。

在该问题的答案中提出的解决方案是连接自定义代理服务器,该服务器检查响应并过滤掉任何会导致下载提示的内容。如何在我的.NET应用程序中实现这样的代理?我不想安装第三方软件或库。

我找到了HttpListener class,但我遇到了两个问题:

  1. 侦听器需要一组触发它的预定义前缀。但是,我不想在我的应用程序中硬编码主机名或端口号,并保持通用。
  2. 我必须实现自己执行实际请求的代码 - 对我来说没有什么可以做到这一点,我可以直接进入该行,检查响应的内容并根据需要更改它们(如J2EE中的请求过滤器是否在服务器端)?
  3. 更新

    好吧,我想我需要更清楚:我的.NET(富客户端)应用程序正在多个项目中使用,这些项目也有基于Web的应用程序。 .NET应用程序包含一个带有WebBrowser控件的可重用的通用表单。其他开发人员使用该表单将对其Web应用程序的访问集成到.NET应用程序中。

    我想阻止下载,所以我希望我的WebBrowser表单拦截所有流量,并确保它不会导致“另存为”对话框。因此...

    • 我不知道主机名是什么
    • WebBrowser指向真实的网址,用户点击常规链接,触发JavaScript ...所有由网络应用程序提供服务
    • 如果WebBrowser指向localhost(如建议的那样),我必须解析响应并重写所有链接,以便它们再次指向localhost,保留原始URL。我不想经历那种麻烦。

2 个答案:

答案 0 :(得分:5)

HttpListener应该没问题,但它只是围绕http.sys包装,而且这个库仅在Windows XP及更高版本上可用。

HttpPrefixes

您只需要一个前缀http://127.0.0.1:8080/,因为它只适用于您的本地网络控件。或者,支持通配符,如http://*:8080/,但没有理由在您的情况下使用它。

  

Jens Bannmann写道:

     

访问的应用程序不在localhost上   可以在任何地方。这就是我不这样做的原因   想要硬编码。

你的申请是什么意思?你的意思是网站?这完全不同,您的特殊代理服务器将在http://127.0.0.1:8080/上侦听HttpListenerRequests,因此您的webcontrol必须使用代理服务器http://127.0.0.1:8080/。此时它仍然在本地机器内。

在HttpListenerRequest / Response和HttpWebRequest / Response之间转换

将每个传入的HttpListenerRequest转换为HttpWebRequest,请求响应并获得HttpWebResponse个对象,分析它是否允许对WebBrowser控件进行响应,如果是,则将其写入进入HttpListnererResponse对象,否则写入其他内容(错误状态)。

这可能是在.NET上构建自己的代理服务器的最简单方法

  

Jens Bannmann写道:

     

是的,这种转换是我的事   我想避免这么做。或者我可以   只在几行代码中做到这一点?从   看看API,看起来更多   复杂。

这实际上很简单,因为http协议是微不足道的。它基本上有三个部分。

  • 请求行(包含URL,http方法和http版本)
  • 标题(这实际上是使API看起来如此巨大和重要的原因,但实际上所有这些属性和方法都只是原始http标题上的薄层。您需要做的就是直接复制所有标题HttpListenerRequestHttpWebRequest的通用方式。两个类都具有用于原始访问的通用标头属性)
  • 邮件正文(只要复制其内容,如果有的话)

整个转换看起来像这样:

HttpListenerRequest listenerRequest;

WebRequest webRequest = WebRequest.Create(listenerRequest.Url);
webRequest.Method = listenerRequest.HttpMethod;
webRequest.Headers.Add(listenerRequest.Headers);
byte[] body = new byte[listenerRequest.InputStream.Length];
listenerRequest.InputStream.Read(body, 0, body.Length);
webRequest.GetRequestStream().Write(body, 0, body.Length);

WebResponse webResponse = webRequest.GetResponse();

如果您需要更多关于http协议的帮助,refer to this wikipedia article

您还可以检查this open source project以了解其他方法。它不依赖于HttpListener类,但它是完整的代理服务器解决方案,应该很容易根据您的需要进行修改。

答案 1 :(得分:0)

也许是一个开源代理?

http://www.mentalis.org/soft/projects/proxy/