代码之家  ›  专栏  ›  技术社区  ›  Jens Bannmann skiwi

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

  •  2
  • Jens Bannmann skiwi  · 技术社区  · 16 年前

    最后,我想 block downloads in .NET WebBrowser control ,有效地限制了它显示HTML、图像、脚本等,但从来没有, 向用户显示“另存为”对话框。

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

    HttpListener class ,但我有两个问题:

    1. 侦听器需要一组预定义的前缀来触发它。但是,我不希望在我的应用程序中硬编码主机名或端口号,并保持它的通用性。
    2. 我必须自己实现实际请求的代码-难道没有什么东西可以帮我做到这一点吗?在这里,我可以简单地进入行,检查响应的内容,并根据需要更改它们(就像J2EE中的请求过滤器在服务器端所做的那样)?

    更新

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

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

    • 我不知道主机名是什么
    • WebBrowser指向真正的url,用户单击常规链接,触发JavaScript。。。全部由web应用程序提供
    2 回复  |  直到 7 年前
        1
  •  5
  •   roryf    16 年前

    HttpListener 应该没问题,但它只是对http.sys的包装,这个库仅在WindowsXP及更高版本上可用。

    你只需要一个前缀 http://127.0.0.1:8080/ 因为这只是你的本地网络控制。或者,通配符支持如下 http://*:8080/

    Jens Bannmann写道:

    localhost ,他们 可以在任何地方。所以我才不

    你说申请是什么意思?你是说网站?这完全是另一回事,您的专用代理服务器将在上侦听HttpListenerRequests http://127.0.0.1:8080/ http://127.0.0.1:8080/ . 在这一点上它仍然在本地机器中。

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

    转换每个传入 HttpListenerRequest 进入之内 HttpWebRequest HttpWebResponse 对象,分析是否允许WebBrowser控件响应,如果允许,则将其写入 HttpListnererResponse 对象写入其他内容(错误状态)。

    这可能是在.NET上构建自己的代理服务器的最简单方法

    Jens Bannmann写道:

    是的,这种转变是我 想避免不得不这样做。或者我能 只需要几行代码就可以了?从 很复杂。

    • 请求行(包含URL、http方法和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公司 类,但它是完整的代理服务器解决方案,应该很容易根据需要进行修改。