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

Jen*_*ann 2 .net browser proxy response filter

最后,我想阻止在.NET WebBrowser控件下载,它有效地限制为显示HTML,图片,脚本和等,但永远,永远显示"另存为"对话框中给用户.

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

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

  1. 侦听器需要一组触发它的预定义前缀.但是,我不想在我的应用程序中硬编码主机名或端口号,并保持通用.
  2. 我将不得不实现自己执行实际请求的代码 - 是不是有什么东西可以帮助我,我只需点击该行,检查响应的内容并根据需要更改它们(如请求过滤器中的J2EE在服务器端做什么)?

更新

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

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

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

lub*_*sko 5

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

HttpPrefixes

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

Jens Bannmann写道:

访问的应用程序不在localhost,它们可以在任何地方.这就是为什么我不想硬编码任何东西.

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

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

将每个传入转换HttpListenerRequestHttpWebRequest,请求响应并获得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();
Run Code Online (Sandbox Code Playgroud)

如果您需要更多关于http协议的帮助,请参阅此维基百科文章.

您还可以检查此开源项目以获取其他方法.它不依赖于HttpListener类,但它是完整的代理服务器解决方案,应该很容易根据您的需要进行修改.