首页 文章

最准确的方法来重定向HttpRequests

提问于
浏览
0

我正在研究一种解决方案,将http请求从我的浏览器重定向到另一台PC . 简而言之:是否有更准确的方法将传入的HttpListenerRequest作为HttpRequest发送给客户端?

背景:浏览器将http请求发送到127.0.0.1:9666(是的,单击'n' load),应由下载程序回答 . 就我而言,下载程序对我不起作用:http://www.quantumg.net/portforward.php所以我决定在C#中编写一个特定的单击'n'加载重定向器 . 我的问题是重定向浏览器's request. ATM, I listen on 127.0.0.1:9666, send some information to a client, the client redirects this to the downloader program, which answers. (long term short: this is redirected to the browser). But using pre-defined cases to redirect only the core-information doesn' t似乎非常适合我 . 应该可以重定向整个请求 . 所以我不需要区分各种情况,这应该更准确 . 除了复制所有 Headers 和属性之外,还有其他方法可以重定向此请求吗?

服务器使用HttpListener来监听浏览器的请求 . 然后,服务器向客户端发送HttpReqest . 客户端使用HttpListener来侦听服务器的请求 . 客户端向Downloader发送HttpRequest,使用GetResponse,并将其作为响应发送给服务器,服务器响应浏览器 . 我在MSDN中查找了一些函数,但没有找到“复制整个请求”的好方法 .

所以这是我的问题代码:

Thread.Sleep(1500);
//Read client's/JDownloader's stream, send to browser/redirector
do
{
    Read = Outstream.Read(Buffer, 0, Buffer.Length);
    Totalr += Read;
    Instream.Write(Buffer, 0, Read);
    Sent += Read;
    // Bufferstr += ASCIIEncoding.ASCII.GetString(Buffer, 0, Read); debugging
} while (Read != 0);

没有Thread.Sleep,第一次读取返回171字节被读取(正好和HTTP标头,缓冲区长度是1024字节) . 第二次迭代:执行Outstream.Read时,没有任何反应 . 不管我等多久 . 看来,读者正在等待流量接收,但没有流量接收(奇怪......)当线程休眠500-1500ms时,第一次读取返回351bytes被读取(完整的http请求),然后再次,第二次迭代,没有 . 从浏览器或JDownloader的NetworkStream中读取时会发生这种情况 . 它们永远不会返回0.一个脏方法来实现这个工作就是用Read == Buffer.Length替换while参数,脏,因为当接收到Buffer.Length字节时它会失败(无休止等待,yay) . DataAvailable属性似乎也不总是正确的,有时它被设置为false,当程序甚至没有从流中读取内容时,但是有些字节需要接收 . (也很奇怪......)任何其他想法适当的接收循环?


没有人?我的问题的简短摘要:浏览器的请求流和JDownloaders响应流都没有返回0.当尝试另一次读取时,程序只等待接收更多字节 . 所以我不知道读取整个流的故障安全方法 . 只是重复读取,直到读取的字节数低于缓冲区的长度将导致前面提到的无限等待字节,当streamlength%bufferlength == 0时 .

此外,似乎JDownloader需要更多时间来生成答案并将其写入流中,而不是我的程序尝试读取流 . 所以我只收到一部分流 . 另一次读取尝试将导致无休止地等待字节 . 有没有另一种方法来接收整个流而没有静态延迟(通过线程休眠)?

2 回答

相关问题