web-dev-qa-db-ja.com

操作のタイムアウトと(504)ゲートウェイタイムアウトの違い

アプリケーションでHttpWebRequestを使用しています。これは、複数のスレッドで一部のURIをチェックしています。複数の種類のタイムアウト例外が発生します。

  • 操作がタイムアウトしました
  • リモートサーバーがエラーを返しました:(504)ゲートウェイタイムアウト。

詳細は次のとおりです。

System.Net.WebException:操作はSystem.Net.HttpWebRequest.GetResponse()で......にタイムアウトしました.

そして

System.Net.WebException:リモートサーバーがエラーを返しました:(504)ゲートウェイタイムアウト。 System.Net.HttpWebRequest.GetResponse()at ....

これら2つの違いは何ですか。

私の機能は次のようなものです:

public bool CheckUri(Uri m_url)
{
    try
    {
        HttpWebRequest request = HttpWebRequest.Create(m_url) as HttpWebRequest;
        request.UserAgent = "MyUserAgent";

        //For: The underlying connection was closed: An unexpected error occurred on a receive.
        request.KeepAlive = false; 
        request.ProtocolVersion = HttpVersion.Version10;

        request.Method = "HEAD"; //Get only the header information 
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            int statusCode = (int)response.StatusCode;
            if (statusCode >= 100 && statusCode < 400) //Good requests
            {
                string sContent = null;
                using (var stream = response.GetResponseStream())
                using (StreamReader loResponseStream = new StreamReader(stream))
                    sContent = loResponseStream.ReadToEnd();
                return true;

            }
            else
            {
                return false;
                //hard to reach here
            }
        }
    }
    //vexing exception
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.ProtocolError) //400 errors
        {
            var response = ex.Response as HttpWebResponse;

            if (response != null)
            {
                Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
                Console.WriteLine(response.StatusCode);
            }
        }
        else
        {
            Console.WriteLine(ex.Message);
        }
        return false;

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}

また、誰かが教えてもらえれば、複数のスレッドが異なるURIでこのメソッドを呼び出すと問題が発生しますか?クロススレッド例外は発生しません。このメソッドは実際には、ほぼ200のURIのリストを監視するWindowsサービスの一部です。

15
user2711965

最悪の言葉で...

「操作がタイムアウトしました」とは、リクエストを送信しているあなたのプログラムが応答を待っている間にタイムアウトしたことを意味します。これは次のことを意味します:

  1. インターネット接続が不良です(すべてがこのエラーをスローしている場合、これは可能性があります)。
  2. 不正なホスト接続(接続先に問題がある場合)。
  3. 悪いDNS(ホストがドメイン名の場合、これは原因である可能性があります)。
  4. 不正なホストエージェント(ホストエンドの何かが正しく応答していません)。

これらの場合、影響を受けるホストへの接続を手動でテストし、その方法でこれらの問題を解決します。最初に独自の接続をテストし、他のホストをテストしてください。問題が特定のホストである場合は、それらに連絡する必要がある問題がある可能性があります。

「504-Gateway Timeout」が表示された場合、プログラムはホストに正常に接続しましたが、ホスト側で問題が発生し、目的の応答を返すことができませんでした。これは接続の問題ではなく、要求またはホスト自体の問題です。ホストがリクエストを処理しようとして無限ループに陥っている、または単に「ハング」していて、リクエストを処理しているエージェントが諦めてリクエストを送り返した可能性があります。

これらの場合、私はホストを見て、おそらくホストが受け入れるテスト要求を実行しています。ホストがあなたの管理下にない場合は、その人に連絡してエラーを報告してください。

つまり-要するに。最初のタイムアウトは接続関連である可能性が高く、504タイムアウトはホスト処理である可能性があります。お役に立てれば。

26
Michael

操作がタイムアウトしましたclientエラーです。通常は、さまざまな*TimeoutWebRequest(およびその子孫)のプロパティ:TimeoutContinueTimeoutReadWriteTimeout。リクエストを送信したサーバーが設定したタイムアウト時間内に応答しない場合、TimeoutExceptionを取得します。

このエラーを回避するには、タイムアウトを増やします。ただし、デフォルトでは非常に大きいため、増加しても効果はありません。数回試すことができます。それでも問題が解決しない場合は、サーバーがダウンしている可能性があります。

504ゲートウェイタイムアウトserverエラーです。通常は、リクエストを送信したサーバーインフラストラクチャのエラーまたは過負荷が原因です。それはあなたのためのブラックボックスです。

このエラーについては何もできません。サーバー管理者だけが解決できます。エラーの原因が過負荷である場合は、リクエストを数回試すことができますが、これを頻繁に行うと、明らかに害が大きくなります。

一般に、HTTPコードを取得できない場合、それは.NETからの例外です。 HTTPコードを取得した場合は、最初の桁を確認できます。

2** OK
3**リダイレクト
4**Clientエラー
5**Serverエラー

16
Athari

「(操作がタイムアウトしました)」については このリンク を参照してください。問題は、サーバーがすでに何らかのタスクでビジー状態になっていることが原因である可能性があります。また、(504)ゲートウェイタイムアウトとは、Webページのロードまたはブラウザーによる別の要求の入力を試行しているときに、あるサーバーがアクセスしていた別のサーバーからタイムリーな応答を受信しなかったことを意味します。

3
Sumit

操作がタイムアウトしました指定された時間が定義され、サーバーがその特定の時間内に応答できない場合に発生します(リモートサーバー内で発生)

ながら

504エラー HTTPサイクルで(クライアントとサーバー間の通信で発生)通信するときに、任意のクライアント(WebブラウザやCheckUpDownロボットなど)は次のサイクルを通過しますWebサーバー:

サイトのIP名からIPアドレスを取得します(先頭の「http://」なしのサイトURL)。この検索(IP名からIPアドレスへの変換)は、ドメインネームサーバー(DNS)によって提供されます。そのIPアドレスへのIPソケット接続を開きます。そのソケットを介してHTTPデータストリームを書き込みます。応答として、WebサーバーからHTTPデータストリームを受信します。このデータストリームには、HTTPプロトコルによって値が決定されるステータスコードが含まれています。このデータストリームを解析して、ステータスコードやその他の有用な情報を取得します。このエラーは、クライアントが '504'として認識するHTTPステータスコードを受け取ったときに、上記の最後のステップで発生します。 (最終更新:2012年3月)。

504エラーの修正-一般

この問題は、おそらくWebサーバーを含むバックエンドコンピュータ間のIP通信が遅いことが原因です。この問題を解決できるのは、Webサーバーをホストするサイトでネットワークを設定した人だけです。

0
Ajay Kumar