.net 如何实现自定义代理服务器?
最终,我想有效地将其限制为显示HTML、图像、脚本等,但决不向用户显示“另存为”对话框 在对该问题的回答中提出的解决方案是连接一个定制代理服务器,该服务器检查响应并过滤掉任何可能导致下载提示的内容。如何在.NET应用程序中实现这样的代理?我不想安装第三方软件或库 我找到了,但有两个问题:.net 如何实现自定义代理服务器?,.net,proxy,filter,browser,response,.net,Proxy,Filter,Browser,Response,最终,我想有效地将其限制为显示HTML、图像、脚本等,但决不向用户显示“另存为”对话框 在对该问题的回答中提出的解决方案是连接一个定制代理服务器,该服务器检查响应并过滤掉任何可能导致下载提示的内容。如何在.NET应用程序中实现这样的代理?我不想安装第三方软件或库 我找到了,但有两个问题: 侦听器需要一组预定义的前缀来触发它。但是,我不希望在我的应用程序中硬编码主机名或端口号,而是将其保持为通用的 我必须自己实现执行实际请求的代码——难道没有什么东西可以帮我做到这一点吗?我可以简单地点击行,检查响
- 我不知道主持人的名字会是什么
- WebBrowser指向真实的URL,用户单击常规链接,触发JavaScript。。。所有这些都是由web应用程序提供的
- 如果WebBrowser指向localhost(如建议的那样),我必须解析响应并重写所有链接,以便它们再次指向localhost,保留原始URL。我不想经历那种麻烦
HttpListener
应该可以,但它只是围绕http.sys的包装,并且此库仅在Windows XP及更高版本上可用
HttpPrefixes
您只需要一个前缀http://127.0.0.1:8080/
,因为它只用于本地网络控制。或者,支持通配符,如http://*:8080/,但没有理由在您的案例中使用它
延斯·班曼写道:
被访问的应用程序不在本地主机上,它们
可以在任何地方。这就是我不知道的原因
想要硬编码任何东西
你所说的申请是什么意思?你是说网站?这完全是另外一回事,您的特殊代理服务器将在
http://127.0.0.1:8080/
,因此您的网络控制必须使用代理服务器http://127.0.0.1:8080/
。在这一点上,它仍然在本地机器中
在HttpListenerRequest/Response和HttpWebRequest/Response之间转换
将每个传入的HttpListenerRequest
转换为HttpWebRequest
,请求响应,您将得到HttpWebResponse
对象,分析它是否允许您的WebBrowser控件响应,如果允许,则将其写入HttpListenerResponse
对象,否则写入其他内容(错误状态)
这可能是在.NET上构建自己的代理服务器的最简单方法
延斯·班曼写道:
对,这种转变是我
想避免不得不这样做。或者我可以吗
仅在几行代码中执行此操作?从…起
看看API,它看起来更
复杂
这其实很简单,因为http协议很简单。它基本上有三个部分
- 请求行(包含URL、http方法和http版本)
- 标题(这实际上是使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协议的更多帮助
您还可以检查其他方法。它不依赖于
HttpListener
类,但它是完整的代理服务器解决方案,应该很容易根据您的需要进行修改。可能是开源代理
1.被访问的应用程序不在
localhost
上,它们可以在任何地方。这就是为什么我不想硬编码任何东西。2.对,这种转换是我想避免做的事情。或者我可以只在几行代码中完成吗?从API来看,它看起来更复杂。“你说的应用程序是什么意思?你指的是网站?"是的,网站。当表单显示时,WebBrowser指向一个URL,比如说。然后用户使用应用程序并单击链接,例如。localhost如何在这里发挥作用?您的web浏览器从不直接联系这些网站,它总是将请求委托给在localhost上运行的特殊代理服务器。我认为您将首先,我要开始编写一些代码,以充分理解它们是如何组合在一起的。嗨,使用发布的转换代码,我总是会遇到一个例外:“不能直接修改‘主机’头。参数名称:name”不是所有头都可以通过头来设置。Add(),它们有自己的属性。