最终,我想要block downloads in .NET WebBrowser control ,有效地将其限制为显示 HTML、图像、脚本等,但永远不会向用户显示“另存为”对话框。
该问题的答案中提出的解决方案是连接一个自定义代理服务器,该服务器检查响应并过滤掉任何会导致下载提示的内容。如何在我的 .NET 应用程序中实现这样的代理?我不想安装第三方软件或库。
我找到了HttpListener class ,但我有两个问题:
- 监听器需要一组预定义的前缀来触发它。但是,我不希望在应用程序中硬编码主机名或端口号,并保持通用。
- 我必须自己实现执行实际请求的代码 - 是否有一些东西可以为我执行此操作,我可以简单地点击该行,检查响应的内容并根据需要更改它们(例如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 以通用方式从
HttpListenerRequest
到HttpWebRequest
。这两个类都具有用于原始访问的通用 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/