С# Ошибка аутентификации, поскольку удаленная сторона закрыла транспортный поток

Я хочу отметить, что я искал много для этого без решения. Итак, я создал цикл, который будет запускать listBox2, содержащий ссылки, каждый раз создавая HTTP-запрос GET для доступа к полному исходному коду.

Мой код:

 private void button4_Click(object sender, EventArgs e)
    {
        try
        {
            for (int i = 0; i < listBox2.Items.Count; i++)
            {
                code(listBox2.Items[i].ToString() + "\'");
                //await PutTaskDelay();
                //Console.WriteLine(listBox2.Items[i].ToString());
                if (VarrileKeeper.s.ToLower().Contains("mysql"))
                {
                    Console.WriteLine("possitive " + listBox2.Items[i].ToString());
                }
            }
        }
        catch (Exception Fejl)
        {
            Console.WriteLine(Fejl);
        }
    }


 public static String code(string Url)
    {

        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };


        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(Url);
        myRequest.MaximumAutomaticRedirections = 4;
        myRequest.MaximumResponseHeadersLength = 4;
        myRequest.Credentials = CredentialCache.DefaultCredentials;

        myRequest.Method = "GET";

        WebResponse myResponse = myRequest.GetResponse();


        StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
        string result = sr.ReadToEnd();
        sr.Close();
        myResponse.Dispose();
        myResponse.Close();
        VarrileKeeper.s = result;
        return result;
    }

Ошибка ниже запускается, когда цикл обращается к различным URL-адресам, например (http://www.memphremagog.org/fr/lexique.php?id=32). Странно то, что если я удалю цикл и сделаю HTTP GET reqeust на этот сайт, все будет работать нормально.

Первое исключение исключения типа "System.Net.WebException" произошло в System.dll System.Net.WebException: базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. --- > System.IO.IOException: Ошибка аутентификации, поскольку удаленная сторона закрыл транспортный поток.

Я не думаю, что это проблема с сертификатом, потому что иначе я все равно получаю сообщение об ошибке http://www.memphremagog.org/fr/lexique.php?id=32, когда я удаляю цикл.

Любые предложения приветствуются.

Ответ 1

URL-адрес zvoxaudio.com, из ваших комментариев, довольно сложный. У них есть некоторое обнаружение бота для добавления предметов в корзину. Используемая вами ссылка, похоже, не работает независимо от того, что, я думаю, она использует id с истекшим номером; Я смог использовать его, обновив id до 4007001 и изменив его на "https". Однако эта ссылка добавляет элемент в корзину, и сайт не позволяет ботам добавлять предметы в корзину, сайт возвращает ошибку 400 с этим ключом: значение в заголовках:

X-Error-Message: Bots are not allowed to add items to cart

Попробуйте добавить UserAgent к вашему запросу следующим образом:

  myRequest.UserAgent = "Nada";

С этими небольшими изменениями работает ссылка ZVOXAUDIO!

Если вы хотите сохранить URL-адрес в качестве запроса "https", просто добавьте его в свой код.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

Это требуется, потому что ZVOXAUDIO не поддерживает протоколы TLS 1.0 или более ранних версий. Если версия .NET, которую вы используете, не поддерживает TLS 1.2, вы можете использовать SecurityProtocolType.Tls11, поскольку ZVOXAUDIO еще поддерживает TLS 1.1.

Но поскольку, по-видимому, вы пытаетесь запустить этот запуск на максимально возможном количестве сайтов, возможно, вы не хотите разрешать только TLS 1.2, поскольку старые серверы могут его не поддерживать. Я бы установил протокол безопасности следующим образом:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |
                                       SecurityProtocolType.Tls11 |
                                       SecurityProtocolType.Tls |
                                       SecurityProtocolType.Ssl3;

В качестве предложения вы можете установить обратный вызов проверки сертификата сервера и протокол безопасности вне вашего цикла, поскольку он является статическим параметром для всех запросов. Также, если вы используете синтаксис С#, метод Dispose заботится о закрытии и удалении переменных WebResponse и StreamReader для вас. И С# представила "var" еще в .NET 3.0, возможно, вы захотите начать ее обнимать, предполагая, что вы используете 3.0 или более новую структуру. Если вы хотите посмотреть, как это будет выглядеть, посмотрите ниже.

Убедитесь, что у вас есть эти операции:

using System;
using System.IO;
using System.Net;

Затем поместите эти две строки в статический конструктор вашей формы или объекта, я предполагаю, что вы используете форму прямо сейчас:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;

Тогда ваши два метода будут выглядеть так:

private void button4_Click(object sender, EventArgs e)
{
  try
  {
    for (var i = 0; i < listBox2.Items.Count; i++)
    {
      var response = Code(listBox2.Items[i].ToString() + "\'");
      if (response.ToLower().Contains("mysql"))
      {
        Console.WriteLine("positive " + listBox2.Items[i].ToString());
      }
    }
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.Message);
  }
}


public static string Code(string url)
{
  var webRequest = (HttpWebRequest)WebRequest.Create(url);
  webRequest.MaximumAutomaticRedirections = 4;
  webRequest.MaximumResponseHeadersLength = 4;
  webRequest.UserAgent = "Mozilla/5.0 (Taco2) Gecko/20100101";
  webRequest.Credentials = CredentialCache.DefaultCredentials;

  webRequest.Method = "GET";

  using (var webResponse = webRequest.GetResponse())
  {
    using (var sr = new StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8))
    {
      return sr.ReadToEnd();
    }
  }
}

Счастливое кодирование! Не стесняйтесь задавать любые вопросы в комментариях ниже.

Ответ 2

Это произошло со мной, но для меня это было связано с проблемой протокола безопасности.

Просто добавьте эту строку

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Дополнительная информация → https://codeshare.co.uk/blog/how-to-fix-the-error-authentication-failed-because-the-remote-party-has-closed-the-transport-stream/