0

次のJavaコードを実行すると、テストしているWebページが稼働しているかどうかを判断する際に、非常に正確で一貫性のある結果が得られます。

protected synchronized boolean checkUrl(HttpURLConnection connection){
    boolean error = false;
    //HttpURLConnection connection = null;
    GregorianCalendar calendar = new GregorianCalendar();

    try{
        if(connection != null){
            connection.connect();

            //200 is the expected HTTP_OK response
            error = processResponseCode(connection.getResponseCode());

            connection.disconnect();
        } else{
            error = false;
        }

    }catch(java.net.UnknownHostException uhe){
        ...     } 
    catch(Exception e){
        ...     }

    return error;
}

c#のJavaパターンに最も近い一致では、誤検知の結果がはるかに高くなります(主にタイムアウトが原因で、デフォルトの期間は100000ミリ秒です)。

protected bool connectedToUrl = false;
        response = null;

        HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(this.getUri());
        webreq.Credentials = CredentialCache.DefaultCredentials;
        WebResponse res = null;// webreq.GetResponse();

        try
        {
            WebRequest request = WebRequest.Create(this.getUri()) as WebRequest;
            request.Credentials = CredentialCache.DefaultCredentials;

            if (request != null)
            {
                // Get response 
                res = webreq.GetResponse();

                connectedToUrl = processResponseCode(res);
            }
            else
            {
                logger.Fatal(getFatalMessage());

                string error = string.Empty;
            }
        }
        catch (Exception e)
        {
            throw e;
        }

        return connectedToUrl;
    }

引用されたJavaコードの有効性に一致するように、c#でさまざまなパターンを試しましたが、役に立ちませんでした。

何か案は?

4

4 に答える 4

3

これは、リクエストオブジェクトを閉じていないためだと思います。

于 2009-01-27T21:06:42.327 に答える
1

またこれ:

   catch (Exception e)
   {
      throw e;
   }

上向きにバブルされた例外でスタックトレースを破棄するだけです。コードの他の場所でエラー処理が発生した場合は、trycatchブロックを削除することをお勧めします。それ以外の場合は、例外をログに記録して先に進む必要があります。ただ捕まえて投げるだけではいけません。

于 2009-01-27T21:12:39.647 に答える
1

これを変更するだけです:

res = webreq.GetResponse();
connectedToUrl = processResponseCode(res);

using (WebResponse res = webreq.GetResponse()) 
{
    connectedToUrl = processResponseCode(res);
}

(以前の宣言を削除します。)

応答を閉じたり破棄したりするまで(または応答が確定するまで)、接続を保持します。一度に1つのホストに接続できるのは特定の数(デフォルトでは2)のみであるため、タイムアウトになります。応答を破棄すると、別の要求が同じ接続を使用できるようになります。

于 2009-01-27T21:18:40.133 に答える
0

私はあなたがC#バージョンでGregorianCalendarを見逃していると思います:-)

C#バージョンに2つのリクエストオブジェクトがあるのはなぜですか?

于 2009-01-27T21:06:56.333 に答える