【问题标题】:C# Simple Web Proxy fails with "Unable to read data from the transport connection"C# 简单 Web 代理因“无法从传输连接读取数据”而失败
【发布时间】:2016-10-24 16:19:03
【问题描述】:

我正在编写一个简单的 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.dll 中的“System.IO.IOException”

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

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

【问题讨论】:

  • 我会使用FiddlerCore
  • 您没有发布任何内容。这看起来像一个 GET 请求。你用 request.Method = "GET" 试过了吗?
  • @JanneP,是的,帖子正文是空的,但是目的地需要使用POST方法
  • @L.B,它对我有什么帮助?
  • @MaxDove 如果你在阅读页面时没有看到它,那么它真的帮不了你..算了。

标签: c# networking proxy httpwebrequest httphandler


【解决方案1】:

所以我发现了问题:

我的代理查询的服务器使用了Transfer-Encoding: chunked

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

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

但是,只要我的数据已经未分块,我就会向客户端发送未分块数据。

所以,客户端收到了未分块的数据和标头,上面说要再次取消分块,这导致了问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多