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

标签 .net proxy filter browser response

最终,我想要block downloads in .NET WebBrowser control ,有效地将其限制为显示 HTML、图像、脚本等,但永远不会向用户显示“另存为”对话框。

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

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

  1. 监听器需要一组预定义的前缀来触发它。但是,我不希望在应用程序中硬编码主机名或端口号,并保持通用。
  2. 我必须自己实现执行实际请求的代码 - 是否有一些东西可以为我执行此操作,我可以简单地点击该行,检查响应的内容并根据需要更改它们(例如J2EE 中的请求过滤器在服务器端执行)?

更新

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

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

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

最佳答案

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

Http前缀

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

Jens Bannmann wrote:

The applications that are accessed are not on localhost, they can be anywhere. That's why I don't want to hard-code anything.

应用程序是什么意思?你是说网站吗?这是完全不同的事情,您的特殊代理服务器将监听 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 wrote:

Right, this conversion was the thing I wanted to avoid having to do. Or can I do that in only a few code lines? From looking at the API, it looks more complicated.

这实际上很简单,因为 http 协议(protocol)很简单。它基本上由三个部分组成。

  • 请求行(包含 URL、http 方法和 http 版本)
  • header (这实际上是 API 看起来如此庞大和重要的原因,但实际上所有这些属性和方法只是原始 http header 的薄层。您所需要做的就是直接复制所有 header 以通用方式从 HttpListenerRequestHttpWebRequest。这两个类都具有用于原始访问的通用 Headers 属性)
  • 消息正文(有内容只需复制)

整个转换看起来像这样:

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协议(protocol)的更多帮助,refer to this wikipedia article .

您还可以查看this open source project另一种方法。它不依赖于 HttpListener 类,但它是完整的代理服务器解决方案,并且应该很容易根据您的需求进行修改。

关于.net - 如何实现自定义代理服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506718/

相关文章:

c# - 从AD获取用户角色的简单方法?

node.js - 我真的需要代理来处理 Node.js 吗?

javascript - 如何在nodejs中设置网络缓存代理服务器以减少互联网使用

JavaScript 函数变量

C# HttpClient.SendAsync 始终返回 404 但 URL 在浏览器中有效

.net - System.IO.File.ReadAllText 不会因无效编码而抛出异常

.net - 如何使用 ILogger 和应用程序洞察关联相关的自定义日志?

java - 如何在 java 中获取代理对象的底层类型?

java - 如何对字符串数组进行排序和过滤?

c# - 锐化滤镜 - 无效果