Базовое соединение было закрыто, исключение, в то время как WebClient DownloadString

Просто кусок кода

WebClient wc = new WebClient();
String str = wc.DownloadString(new Uri("http://content.warframe.com/dynamic/rss.php"));

И я получил исключение:

Произошло необработанное исключение типа «System.Net.WebException» в System.dll.

Дополнительные сведения: базовое соединение было закрыто: соединение было неожиданно закрыто.

Я думал, что это ошибка в .NET (я использую 3.5), но я пробовал другие методы, чтобы получить содержимое этой ссылки (ее rss, xml). Удачного выстрела пока нет

var webrequest = (WebRequest)HttpWebRequest.Create(@"http://content.warframe.com/dynamic/rss.php");
var resp = webrequest.GetResponse();
//HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse(); // Wont work also

Этот код выше тоже не будет работать, оба выдают одно и то же исключение

Журналы Fiddler:

СОСТОЯНИЕ СЕАНСА: Прервано.
Размер объекта ответа: 512 байт.

== ФЛАГИ ==================
BitFlags: [ResponseGeneratedByFiddler] 0x100
X-ABORTED-WHEN: Done
X-CLIENTIP: 127.0.0.1
X-CLIENTPORT: 2747
X-EGRESSPORT: 2748
X-FAILSESSION-WHEN: ReadingResponse
X-HOSTIP: 205.185.216.10
X-PROCESSINFO: willitwork.vshost:3300

== ИНФОРМАЦИЯ О ВРЕМЕНИ ============
ClientConnected: 10:29:11.706
ClientBeginRequest: 10:29:11.713
GotRequestHeaders: 10:29:11.713
ClientDoneRequest . : 10:29:11.953
ServerGotRequest: 10:29:11.953
ServerBeginResponse: 10:29:12.372
GotResponseHeaders: 00:00:00.000
ServerDoneResponse: 10:29:12.372
ClientBeginResponse : 10:29:12.385
ClientDoneResponse: 10:29:12.385

Всего прошло: 0:00:00.672

Ответ был помещен в буфер перед доставкой клиенту.

== WININET CACHE INFO =============
Этот URL отсутствует в кэше WinINET. [Код: 2]
* Примечание. Приведенные выше данные показывают текущее состояние кэша WinINET, а не состояние на момент запроса.
* Примечание. Приведенные выше данные показывают только кэш WinINET со средней целостностью (незащищенный режим).

Также - 504, это не имеет смысла, так как я могу получить данные по ссылке через chrome/firefox/ie...

Я просто сделал это, чтобы работать на другом языке, но я вынужден делать это с С# (я сделал 2 кода, чтобы переписать его)

Я добавил некоторые настройки, как сказал скрипач

myHttpWebRequest1.ProtocolVersion = HttpVersion.Version11;
myHttpWebRequest1.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36";
myHttpWebRequest1.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";

По крайней мере, теперь я получаю ошибку 504 вместо "неизвестно", но я все еще могу просматривать содержимое через веб-браузер, поэтому ошибка 504 является фальшивой.

Изменить: при добавлении нет ошибки ответа

myHttpWebRequest1.Headers["Accept-Encoding"] = "gzip";

но теперь вывод испорчен и нечитаем


person Bartłomiej Sobieszek    schedule 13.07.2014    source источник
comment
Не делайте поспешных выводов, что это ошибка BCL. Тот факт, что изменение заголовков запроса приводит к другой ошибке, является убедительным доказательством того, что серверу просто не понравилось то, что вы отправили.   -  person usr    schedule 13.07.2014
comment
Я пытаюсь отправить то, что было отправлено моим веб-браузером (по крайней мере, заголовки). Я всегда следую правилу, что код работает так, как вы его написали.   -  person Bartłomiej Sobieszek    schedule 13.07.2014
comment
После установки патча support.microsoft.com/en-us/kb/3042058 мы получили это сообщение при использовании SSL (TLS 1.0) в .Net Framework 3.5. Удаление обновления решило проблему.   -  person James Westgate    schedule 15.10.2015


Ответы (3)


у меня такая же ошибка.

Вы можете добавить User Agent в свой httpRequest.

request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
person Viktor Mezhenskyi    schedule 07.06.2015

Хорошо, я получил все исправления и работает!

static void Main(string[] args)
{
    Uri url = new Uri(@"http://content.warframe.com/dynamic/rss.php");

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    // MAGIC LINE GOES HERE \/
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

    // Assign the response object of HttpWebRequest to a HttpWebResponse variable.
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (Stream streamResponse = response.GetResponseStream())
        {
            using (StreamReader streamRead = new StreamReader(streamResponse))
            {
                Char[] readBuff = new Char[2000];
                int count = streamRead.Read(readBuff, 0, 2000);
                while (count > 0)
                {
                    String outputData = new String(readBuff, 0, count);
                    Console.Write(outputData);
                    count = streamRead.Read(readBuff, 0, 2000);
                }
            }
        }
    }

    Console.ReadKey();
}

Помимо неиспользования метода WebClient.DownloadString, мне пришлось добавить строку decompresion

request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

Спасибо за советы (особенно скрипач, кнопка «Декодировать» сэкономила мне время, чтобы найти, что не так)

person Bartłomiej Sobieszek    schedule 14.07.2014
comment
А знаете ли вы, как это возможно, что код работал без проблем с моего домашнего компьютера, и вам пришлось распаковывать? Это общедоступный веб-сайт, поэтому он должен работать одинаково для меня и для вас? - person Vojtěch Dohnal; 14.07.2014
comment
Я думаю, что это должно быть настроено на стороне клиента, я искал ответ и нашел только заметки о конфигурации IIS. Поскольку в Windows 7 у меня не установлен IIS по умолчанию, я сделал это вручную, и он показывает, что у меня не установлен модуль для динамического сжатия (в данном случае php). Я не эксперт в веб-вещах, и я думаю, что IIS - неправильное место для поиска ответа... - person Bartłomiej Sobieszek; 15.07.2014
comment
Не работает для меня. Я все еще получил: Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. InnerException = {Аутентификация не удалась, поскольку удаленная сторона закрыла транспортный поток.} - person Robert Green MBA; 30.10.2018

Проверьте этот ответ:

.. Базовое соединение было закрыто: При получении произошла непредвиденная ошибка

Так что это может сработать для вас:

var webRequest = (HttpWebRequest)HttpWebRequest.Create(@"http://content.warframe.com/dynamic/rss.php");
webRequest.KeepAlive = false;
var resp = webRequest.GetResponse();        

РЕДАКТИРОВАТЬ:

Вы правы, проверьте скорее это: http://msdn.microsoft.com/cs-cz/library/system.net.httpwebrequest.keepalive%28v=vs.110%29.aspx

Вот рабочий код, который распечатает полученное содержимое ответа:

    static void Main(string[] args)
    {
          // Create a new HttpWebRequest object.Make sure that 
          // a default proxy is set if you are behind a firewall.
          HttpWebRequest myHttpWebRequest1 =
            (HttpWebRequest)WebRequest.Create(@"http://content.warframe.com/dynamic/rss.php");

          myHttpWebRequest1.KeepAlive=false;
          // Assign the response object of HttpWebRequest to a HttpWebResponse variable.
          HttpWebResponse myHttpWebResponse1 = 
            (HttpWebResponse)myHttpWebRequest1.GetResponse();

          Console.WriteLine("\nThe HTTP request Headers for the first request are: \n{0}", myHttpWebRequest1.Headers);

          Stream streamResponse = myHttpWebResponse1.GetResponseStream();
          StreamReader streamRead = new StreamReader(streamResponse);
          Char[] readBuff = new Char[256];
          int count = streamRead.Read(readBuff, 0, 256);
          Console.WriteLine("The contents of the Html page are.......\n");
          while (count > 0)
          {
              String outputData = new String(readBuff, 0, count);
              Console.Write(outputData);
              count = streamRead.Read(readBuff, 0, 256);
          }
          Console.WriteLine();
          // Close the Stream object.
          streamResponse.Close();
          streamRead.Close();
          Console.ReadKey();
    }
person Vojtěch Dohnal    schedule 13.07.2014
comment
WebRequest не имеет метода KeepAlive, ссылка мне не помогла, потому что я не понимаю, как внедрить его код в свой - person Bartłomiej Sobieszek; 13.07.2014
comment
Нет, все еще не работает. Я отключил брандмауэр, перезагрузил компьютер в случае незакрытых потоков, я даже сменил свой IP ... все та же проблема. Получитьответ() не удается - person Bartłomiej Sobieszek; 13.07.2014
comment
На моем компьютере этот код отлично работает с использованием .NET 3.5, как и вы. Похоже, ваша проблема в другом. Вы получаете ответ, используя обычный браузер? Если да, попробуйте создать простое консольное приложение, используя приведенный выше код, и посмотрите, работает ли оно. Также попробуйте добавить myHttpWebRequest1.ProtocolVersion=HttpVersion.Version10; - person Vojtěch Dohnal; 13.07.2014
comment
Другой вариант — отлаживать запросы с помощью Fiddler. - person Vojtěch Dohnal; 13.07.2014
comment
Я гуглил о скрипаче, но мне придется немного этому научиться. Он не будет работать на моем ПК, ноутбуке и ПК друга, но это может быть ошибка компиляции или что-то в этом роде. - person Bartłomiej Sobieszek; 13.07.2014
comment
Fiddler автоматически внедрит себя для веб-браузеров, но вы должны добавить его в качестве прокси-сервера для других приложений, созданных вручную. - person user1664043; 17.08.2020