C#简单Web代理失败,"无法从传输连接中读取数据"

时间:2016-10-24 16:19:04

标签: c# networking proxy httpwebrequest httphandler

我正在编写一个简单的Web代理应用程序(作为IHttpHandler),它基本上可以处理传入的请求并返回响应,它的外观如下:

public void ProcessRequest(HttpContext context)
{
   var destinationUrl = GetDestinationUrlFromRequest(context);

   var destinationRequest = WebRequest.Create(destinationUrl);
   CopyHeadersFromTo(context.Request, destinationRequest);
   var destinationResponse = destinationRequest.GetResponse();
   CopyHeadersFromTo(destinationResponse, context.Response);
   var destinationResponseStream = destinationResponse.GetResponseStream();
   using (var streamReader = new StreamReader(destinationResponseStream))
   {
       var result = streamReader.ReadToEnd();
       context.Response.Write(result);
       streamReader.Close();
   }
   context.Response.End();
}

另外,我还有另一个小应用程序,它从上面查询以获得响应:

public string QueryData(ICredentials credentials)
{
    var request = (HttpWebRequest) WebRequest.Create("myproxyapp.com/?url=urltoProxy.com");

    request.Method = "POST";
    request.ContentLength = 0;
    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version10;
    request.ServicePoint.ConnectionLimit = 1;
    if (credentials != null)
    {
        request.Credentials = credentials;
    }
    else
    {
        request.UseDefaultCredentials = true;
    }
    using (var response = (HttpWebResponse) request.GetResponse())
    {
        using (var sr = new StreamReader(response.GetResponseStream()))
        {
            return sr.ReadToEnd();
        }
    }
}

在sr.ReadToEnd()上,我不断得到这个:

  

抛出异常:' System.IO.IOException'在System.dll

中      

其他信息:无法从传输中读取数据   连接:连接已关闭。

有人可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

所以我发现了问题:

我的代理查询的服务器使用转移编码:分块

在我的代理应用程序中,我已经收到了unchunked数据(这就是HTTP和.NET的工作方式)。

我正在将代理响应中的所有标头复制到客户端,甚至是 Transfer-Encoding:chunked 标头。

但是,只要我的数据已经没有中断,我就会将 unchunked 数据发送到客户端。

因此,客户端收到了未分块的数据和标题,表示再次将其拆开,这导致了问题!