PR

【C#】PINGを使用したWEBサーバの起動確認

【C#】
広告

C#のデスクトップアプリからpythonで作成されたWebサーバを起動し、WebサーバのAPIを使用しながら処理を行うという要件がありました。

時間やコストの都合(技術力も含むw)で、Webサーバの起動はコマンドラインから起動するということとなったのですが、コマンドをプロセスに割り当てることは出来たものの、Webサーバの起動までは簡単に管理できませんでした。

そこで、正確なWEBサーバの起動は確認できないものの、PINGで疎通確認できれば良いかなということで、次のAIにコード生成をお願いしてみました。

  • Bing AI
  • ChatGPT
  • Bard

似たようなことでお悩みの方はご参考にどうぞ。

AIへの依頼内容(PING)

今回は、WEBサーバの機能に時間がかかることも想定し、PINGのタイムアウトとリトライ回数を指定した以下の内容でコード生成を依頼しました。

pingを使用してWebAPIが起動しているか確認したい。タイムアウトは5秒で3回までリトライを行いたい。

Bing AI の回答(PING)

C#でWebAPIが起動しているかどうかを確認するために、Pingクラスを使用することができます。Pingクラスには、Sendメソッドがあり、これを使用してリモートコンピューターにICMPエコー要求メッセージを送信し、その応答を受信することができます。

タイムアウトとリトライの機能は、Pingクラスには組み込まれていません。そのため、これらの機能を実装するためには、独自のコードを記述する必要があります。例えば、次のようなコードが考えられます。

using System;
using System.Net.NetworkInformation;

namespace MyApp
{
    public static class PingHelper
    {
        public static bool PingWithRetry(string host, int timeout, int maxRetries)
        {
            var ping = new Ping();
            for (int i = 0; i < maxRetries; i++)
            {
                var reply = ping.Send(host, timeout);
                if (reply.Status == IPStatus.Success)
                {
                    return true;
                }
            }
            return false;
        }
    }
}

上記のコードでは、PingWithRetryメソッドを定義しています。このメソッドは、指定されたホストに対してPingを送信し、応答が成功した場合はtrueを返します。応答が失敗した場合は、指定された回数だけリトライします。リトライ回数が上限に達した場合はfalseを返します。

このような方法で、WebAPIが起動しているかどうかを確認することができます。ただし、Pingがブロックされている場合や、WebAPIが応答しない場合など、正確な結果が得られない場合もありますのでご注意ください。

ChatGPT の回答(PING)

pingコマンドは通常、ネットワークデバイスに対してICMP Echo Requestを送信して応答を待機しますが、Web APIの起動を確認するためにはHTTPリクエストを使用する必要があります。

C#でWeb APIの起動を確認する場合は、HttpClientを使用してHTTPリクエストを送信し、Web APIの応答を待機することが一般的です。以下は、C#でHttpClientを使用してWeb APIの起動を確認する例です。リトライはタイムアウトが発生した場合に3回まで行います。

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string apiEndpoint = "http://example.com/api"; // Web APIのエンドポイントを指定
        int retryCount = 3;
        int timeoutMilliseconds = 5000;

        bool isApiAvailable = await IsApiAvailable(apiEndpoint, retryCount, timeoutMilliseconds);

        if (isApiAvailable)
        {
            Console.WriteLine("Web APIが起動しています。");
        }
        else
        {
            Console.WriteLine("Web APIが起動していません。");
        }
    }

    static async Task<bool> IsApiAvailable(string apiEndpoint, int retryCount, int timeoutMilliseconds)
    {
        using (HttpClient httpClient = new HttpClient())
        {
            for (int retry = 0; retry < retryCount; retry++)
            {
                try
                {
                    HttpResponseMessage response = await httpClient.GetAsync(apiEndpoint);
                    response.EnsureSuccessStatusCode(); // 応答が成功したかを確認

                    return true; // Web APIが正常に応答した場合はtrueを返す
                }
                catch (HttpRequestException)
                {
                    // Web APIが応答しなかった場合はリトライを行う
                }

                // リトライのインターバルを設定(例: 1秒待つ)
                await Task.Delay(1000);
            }
        }

        return false; // リトライ回数内にWeb APIが応答しなかった場合はfalseを返す
    }
}

上記の例では、HttpClientを使用して指定したエンドポイントにGETリクエストを送信し、応答を待機します。Web APIが起動している場合は応答が成功し、IsApiAvailableメソッドがtrueを返します。起動していない場合は例外が発生し、リトライを行います。

リトライ回数とタイムアウトは任意の値に設定できます。必要に応じて値を調整してください。また、Web APIのエンドポイントは適切なものに置き換えてください。

Bard の回答(PING)

はい、もちろんです。C#でpingを使用してWebAPIが起動しているかを確認する方法は次のとおりです。

using System;
using System.Net;

public class Program
{
    public static void Main(string[] args)
    {
        // WebAPIのホスト名またはIPアドレスを指定します。
        string hostName = "www.google.com";

        // タイムアウトを5秒、リトライ回数を3回に設定します。
        int timeout = 5000;
        int retryCount = 3;

        // WebAPIにpingを送信します。
        for (int i = 0; i < retryCount; i++)
        {
            try
            {
                Ping ping = new Ping();
                PingReply reply = ping.Send(hostName, timeout);

                // WebAPIが起動していることを確認します。
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine("WebAPI is up and running.");
                    return;
                }
            }
            catch (PingException ex)
            {
                Console.WriteLine(ex.Message);
            }

            // リトライ間隔を1秒待機します。
            Thread.Sleep(1000);
        }

        // WebAPIが起動していないことを確認します。
        Console.WriteLine("WebAPI is not up and running.");
    }
}

このコードを実行すると、WebAPIが起動しているか確認されます。WebAPIが起動している場合は、「WebAPI is up and running.」と表示され、WebAPIが起動していない場合は、「WebAPI is not up and running.」と表示されます。

PINGのまとめ

今回、パッと見でコードが分かりやすかったのは「Bard」かな。

個人的に好みなのは、「Bing AI」で他のプログラムで共通化して使用できそうです。

また、PingクラスのSendメソッドを使用するという解説がついていたのもポイント高いです。

「ChatGPT」は厳格と言うか何と言うか

「C#でWeb APIの起動を確認する場合は、HttpClientを使用してHTTPリクエストを送信し、Web APIの応答を待機することが一般的です。」とPingの利用は頑なに拒否されました。

今回WEBサーバに応答確認用のAPIが用意されていなかったため、一番良い解決方法を示してくれたと思うのですが、コードの活用ができず残念な結果となりました😅

広告
【C#】
広告
タイトルとURLをコピーしました