2016-10-24 5 views
0

Я сочинительство простой веб-прокси приложений (работает как IHttpHandler), который основно exucutes входящие запросы и возвращает ответ, то, как это выглядит:C# Простой веб-прокси не удается с «Не удается прочитать данные из транспортного соединения»

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

Дополнительная информация: Не удается прочитать данные из соединения транспортного : Соединение было закрыто.

Может кто поможет в решении этой проблемы, пожалуйста?

+0

Я бы использовал [FiddlerCore] (http://www.telerik.com/fiddler/fiddlercore) –

+0

Вы ничего не публикуете. Это похоже на запрос GET. Вы пробовали его с запросом.Method = "GET"? – JanneP

+0

@JanneP, да, тело сообщения пуста, но для назначения требуется использовать метод POST –

ответ

0

Так что я нашел проблему:

сервер, что мой прокси был запрашивая используется Transfer-Encoding: Chunked.

В моем прокси-приложении я уже получил unchunked данные (так работает HTTP и .NET).

Я копировал все заголовки с прокси-ответа клиенту, даже Кодирование передачи: chunked header.

Но, пока мои данные уже были отлучены, я отправил unchunked данные клиенту.

Таким образом, клиент получил unchunked данные и заголовок, который говорит, чтобы разблокировать его снова, что вызвало проблему!

 Смежные вопросы

  • Нет связанных вопросов^_^