web-dev-qa-db-ja.com

リモートパーティがトランスポートストリームを閉じたため、C#認証が失敗しました

私は解決策なしでこれを多く検索したことを指摘したいと思います。したがって、完全なソースコードにアクセスするためにhttp GETリクエストを作成するたびに、リンクを含むlistBox2をスローするループを作成しました。

私のコード:

 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要求を作成すると、すべてが正常に機能することです。

タイプ 'System.Net.WebException'の最初のチャンス例外がSystem.dllで発生しましたSystem.Net.WebException:基礎となる接続が閉じられました:送信時に予期しないエラーが発生しました。 ---> System.IO.IOException:リモートパーティがトランスポートストリームを閉じたため、認証に失敗しました。

それ以外の場合は http://www.memphremagog.org/fr/lexique.php?id=32 でエラーが発生するため、証明書に問題があるとは思わないループ。

どんな提案も大歓迎です。

11
Taco2

コメントからのzvoxaudio.comのURLは非常に注意が必要です。彼らは、カートにアイテムを追加するためのボット検出機能を備えています。あなたが特に使用したリンクは、何があっても機能しないようです。期限切れのアイテムIDを使用していると思います。 idを4007001に更新し、「https」に変更することで使用できました。ただし、このリンクはカートにアイテムを追加しており、サイトではボットがアイテムをカートに追加することを許可していません。サイトはヘッダーに次のkey:valueを含む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をサポートしていない場合、ZVOXAUDIOはまだTLS 1.1をサポートしているため、SecurityProtocolType.Tls11を使用できます。

しかし、おそらく、できるだけ多くのサイトでこれを実行しようとしているので、古いサーバーではサポートされていない可能性があるため、おそらくTLS 1.2のみを許可したくないでしょう。セキュリティプロトコルを次のように設定します。

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

提案として、サーバー証明書検証コールバックとセキュリティプロトコルを、すべての要求に対する静的な設定であるため、ループの外側に設定できます。また、構文を使用してC#を利用する場合、DisposeメソッドがWebResponseおよびStreamReader変数を閉じて破棄します。そして、C#は.NET 3.0に「var」を導入しました。これを採用することをお勧めします。つまり、3.0以降のフレームワークを使用していることを前提としています。これがどのように見えるかを確認したい場合は、以下をご覧ください。

これらを使用していることを確認してください。

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

次に、これらの2行をフォームまたはオブジェクトの静的コンストラクターに配置します。今、フォームを使用していると仮定します。

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

次に、2つのメソッドは次のようになります。

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();
    }
  }
}

ハッピーコーディング!以下のコメントで質問をしてください。

14
TwistedStem

これは私に起こりましたが、私にとっては、セキュリティプロトコルの問題が原因でした。

この行を追加するだけです

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-ストリーム/

0
Arun Prasad E S