0

URIを「ping」して、応答するかどうかを教えてくれるシンプルなアプリを作成しようとしています。

私は次のコードを持っていますが、ルートレベルでのみドメインをチェックしているようです

つまり、www.google.com/voiceではなくwww.google.comです。

private bool WebsiteUp(string path)
    {

        bool status = false;

        try
        {
            Uri uri = new Uri(path);
            WebRequest request = WebRequest.Create(uri);
            request.Timeout = 3000;
            WebResponse response;
            response = request.GetResponse();
            if (response.Headers != null) 
            {
                status = true;
            }

        }
        catch (Exception loi) 
        {
            return false;
        }


        return status;
    }

このニーズにより適した既存のコードはありますか?

4

3 に答える 3

2

編集:実際、私は嘘をつきます-デフォルトでは404はとにかくWeb例外を引き起こすはずです、そして私が覚えていなかった場合に備えてこれを確認しました。例に示されているコードはリークがありますが、それでも機能するはずです。不可解ですが、応答オブジェクトの安全性を高めるために、この回答はここに残しておきます。


あなたが持っているコードの問題は、与えられた正確なURIを実際にチェックしている間、404、500、200などを等しく「成功した」と見なすことです。また、GETを使用してHEADで十分な作業を行うのは少し無駄です。そのWebResponseも本当にクリーンアップする必要があります。そして、この用語pathは、私たちがそこにいる間、単なるパスではない何かのばかげたパラメータ名です。

private bool WebsiteUp(string uri)
{
    try
    {
        WebRequest request = WebRequest.Create(uri);
        request.Timeout = 3000;
        request.Method = "HEAD";
        using(WebResponse response = request.GetResponse())
        {
            HttpWebResponse hRes = response as HttpWebResponse;
            if(hRes == null)
                throw new ArgumentException("Not an HTTP or HTTPS request"); // you may want to have this specifically handle e.g. FTP, but I'm just throwing an exception for now.
            return hRes.StatusCode / 100 == 2;
        }
    }
    catch (WebException) 
    {
        return false;
    }
}

もちろん、常に200を返すような貧弱なWebサイトもありますが、これが最善の方法です。リダイレクトの場合、リダイレクトの最終的なターゲットを気にすることを前提としています(最終的に成功したページまたはエラーページになりますか)が、特定のURIを気にする場合は、次の自動リダイレクトをオフにすることができます。 3xxコードも成功したと考えてください。

于 2010-10-15T10:24:43.383 に答える
1

そのために利用できるPingクラスがあります。詳細については、http: //msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspxを参照してください。

于 2010-10-15T08:55:45.717 に答える
0

有効なトラッカーURLをチェックするためにトレントクライアントを作成したときに同様のことをしました。SOで答えを見つけたのは確かですが、もう見つけられないようです。その投稿からのコードサンプルを次に示します。

   using(var client = new WebClient()) { 
        client.HeadOnly = true; 
        // exists
        string Address1 = client.DownloadString("http://google.com"); 
        // doesnt exist - 404 error
        string Address2 = client.DownloadString("http://google.com/sdfsddsf"); 
    } 
于 2010-10-15T10:18:39.103 に答える