C# HTTP CONNECT stream.ReadToEnd需要无限时间

C# HTTP CONNECT stream.ReadToEnd需要无限时间,c#,stream,http-proxy,C#,Stream,Http Proxy,我正在尝试构建一个类,它应该能够使用HTTP连接代理隧道。 我当前的代码挂起在DoHttpConnect()-“var retvar=await sr.ReadToEndAsync();”上,并且从未到达Console.WriteLine(retvar) 连接类别: public class HttpConnect : BaseProxyModule { public HttpConnect(HostPortCollection proxyInformation) : base(pro

我正在尝试构建一个类,它应该能够使用HTTP连接代理隧道。 我当前的代码挂起在
DoHttpConnect()-“var retvar=await sr.ReadToEndAsync();”
上,并且从未到达
Console.WriteLine(retvar)

连接类别:

 public class HttpConnect : BaseProxyModule
{
    public HttpConnect(HostPortCollection proxyInformation) : base(proxyInformation)
    {
    }

    public override async Task<Stream> OpenStreamAsync(HostPortCollection dstSrv)
    {
        var socket = new TcpClient();
        if (await SwallowExceptionUtils.TryExec(() => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected)
        {
            var nStream = socket.GetStream();
            var cmd = ProxyCommandBuildUtils.GenerateHttpConnectCommand(dstSrv.Host, dstSrv.Port);

            await nStream.WriteAsync(cmd, 0, cmd.Length);
            var sr = new StreamReader(nStream);
            var cLine = await sr.ReadLineAsync();
            var fLineElem = cLine.Split(' ');

            if (fLineElem.Length >= 1 && fLineElem[1] == "200")
            {
                await sr.ReadLineAsync();
                return nStream;
            }
        }
        return null;
    }

    internal class ProxyCommandBuildUtils
    {
        private const string HTTP_PROXY_CONNECT_CMD = "CONNECT {0}:{1} HTTP/1.1\r\nHost: {0}\r\n\r\n";

        public static byte[] GenerateHttpConnectCommand(string host, int port)
        {
            string connectCmd = String.Format(CultureInfo.InvariantCulture, HTTP_PROXY_CONNECT_CMD, host, port.ToString(CultureInfo.InvariantCulture));
            return connectCmd.GetBytes();
        }
    }
WriteLineAsync()
调用实际上不会立即向网络进行写操作。相反,
StreamWriter
将其保存在缓冲区中。因此,服务器实际上从未收到您的请求,因此不会向您发送回复

应通过执行以下操作之一,强制缓冲区向网络写入数据:

  • StreamWriter
    启用
    AutoFlush
    (),这将使它在每次调用
    WriteLineAsync()
  • 显式调用
    FlushAsync()
    ()
  • 通过如下方式重写代码关闭流(将刷新缓冲区):

    using (var sr = new StreamReader(pStream))
    {
        using (var sw = new StreamWriter(pStream))
        {
            await sw.WriteLineAsync(request);
        }
    
        var retvar = await sr.ReadToEndAsync();
        Console.WriteLine(retvar);
    }
    

  • 你有没有收到任何回应,或者streamreader会等死吗?@Nikolaus它没有收到任何回应,所以它会等死。只是看了一下wireshark协议,它看起来像“等待sw.WriteLineAsync(请求)”,根本不发送任何内容。哦,非常感谢!我完全忘记了尼格尔算法。有一件事:当streamwrite被释放时,basestream也被释放:/usage func中打开StreamWriter的Autoflush完成了这项工作
    using (var sr = new StreamReader(pStream))
    {
        using (var sw = new StreamWriter(pStream))
        {
            await sw.WriteLineAsync(request);
        }
    
        var retvar = await sr.ReadToEndAsync();
        Console.WriteLine(retvar);
    }