最终,我希望block downloads in .NET WebBrowser control,有效地限制它显示HTML,图像,脚本等,但从来没有永远向用户显示“另存为”对话框。
在该问题的答案中提出的解决方案是连接自定义代理服务器,该服务器检查响应并过滤掉任何会导致下载提示的内容。如何在我的.NET应用程序中实现这样的代理?我不想安装第三方软件或库。
我找到了HttpListener class,但我遇到了两个问题:
好吧,我想我需要更清楚:我的.NET(富客户端)应用程序正在多个项目中使用,这些项目也有基于Web的应用程序。 .NET应用程序包含一个带有WebBrowser控件的可重用的通用表单。其他开发人员使用该表单将对其Web应用程序的访问集成到.NET应用程序中。
我想阻止下载,所以我希望我的WebBrowser表单拦截所有流量,并确保它不会导致“另存为”对话框。因此...
答案 0 :(得分:5)
HttpListener
应该没问题,但它只是围绕http.sys包装,而且这个库仅在Windows XP及更高版本上可用。
您只需要一个前缀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
转换为HttpWebRequest
,请求响应并获得HttpWebResponse
个对象,分析它是否允许对WebBrowser控件进行响应,如果是,则将其写入进入HttpListnererResponse
对象,否则写入其他内容(错误状态)。
这可能是在.NET上构建自己的代理服务器的最简单方法
Jens Bannmann写道:
是的,这种转换是我的事 我想避免这么做。或者我可以 只在几行代码中做到这一点?从 看看API,看起来更多 复杂。
这实际上很简单,因为http协议是微不足道的。它基本上有三个部分。
HttpListenerRequest
到HttpWebRequest
的通用方式。两个类都具有用于原始访问的通用标头属性)整个转换看起来像这样:
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)
也许是一个开源代理?