web-dev-qa-db-ja.com

pingを使用せずにWebサービスが稼働しているかどうかを確認するにはどうすればよいですか?

Webサービスのメソッドが正常に機能しているかどうかを確認するにはどうすればよいですか? pingが使えません。クライアントによってWebサービスから呼び出されているあらゆる種類のメソッドを引き続き確認したいと思います。一般化するのは難しいと思いますが、何らかの方法があるはずです。

10
bebojoor

Webサービスメソッドが「正常」に機能しているかどうかを知る唯一の方法は、メソッドを呼び出して、結果が「正常」であるかどうかを評価することです。 「細かい」対時間の記録を保持したい場合は、評価の結果をログに記録できます。

これを行うための一般的な方法はこれ以上ありません。考えてみましょう:

  1. サービスエンドポイントへのHTTP接続を作成するコードを作成することもできますが、成功しても、メッセージを送信するとすぐにサービスが例外をスローするかどうかはわかりません。
  2. 接続して無効なメッセージを送信することはできますが、それではあまりわかりません。
  3. 接続して有効なメッセージを送信し、結果をチェックして有効であることを確認できます。これにより、実際のクライアントが直後にサービスを呼び出すと、実際のクライアントは有効な結果を期待する必要があるというかなり良い考えが得られます。
  4. サービスがそれをクラッシュの機会と見なさない限り、あなたをいじめるだけです!

最善の方法は、WCFトレース(場合によってはメッセージレベルのトレースを使用)を使用して、サービスで実際に何が起こっているか(良いか悪いか)をログに記録することです。次に、人間はログを見て、ログが「正常」であるかどうかを確認できます。

4
John Saunders

私はこの方法を使用し、それはうまくいきます:

public bool IsAddressAvailable(string address)
{
    try
    {
        System.Net.WebClient client = new WebClient();
        client.DownloadData(address);
        return true;
    }
    catch
    {
        return false;
    }
}
4
The Pig's Ear

webサービスのメソッド内でtrycatchを使用して、例外をログファイルまたはイベントログに記録するだけです。例:

[OperationContract]
 public bool isGUID(string input)
{
    bool functionReturnValue = false;

    try
    {
        Guid guid;
        functionReturnValue = Guid.TryParse(input, guid);
    }
    catch (Exception ex)
    {
        Log.WriteServerErrorLog(ex);
    }

    return functionReturnValue;
}

Webサービスにpingを実行する必要はありませんが、代わりにウォッチドッグサービスなどを使用してサーバーにpingを実行します。 Webサービスに「ping」する必要はありません。とにかくこれをする必要はないと思います。 Webサービスが機能するか、コードが正しくないために機能しません。

1
Rumplin

Powershellは、Webサービスエンドポイントを「ping」する非常に簡単な方法です。

次の式を使用します。

Test-NetConnection -Port 4408 -ComputerName 192.168.134.1

存在しない、またはリッスンしていないポートの障害応答は次のとおりです。

WARNING: TCP connect to 192.168.134.1:4408 failed
ComputerName           : 192.168.134.1
RemoteAddress          : 192.168.134.1
RemotePort             : 4408
InterfaceAlias         : Ethernet0
SourceAddress          : 192.168.134.1
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

アドレス/ポートがリッスンしていてアクセス可能である場合の成功結果は次のとおりです。

ComputerName     : 192.168.134.1
RemoteAddress    : 192.168.134.1
RemotePort       : 4407
InterfaceAlias   : Ethernet0
SourceAddress    : 192.168.134.1
TcpTestSucceeded : True
1
Mark Walker

あなたはあなた自身に小さなツールやウィンドウズサービス、あるいはあなたが必要とするものを書くことができます、そしてこれらの2つの記事を見てください:

C#:Webサービスが稼働していることをプログラムで確認する方法は?

Webサービスが稼働しているかどうかを確認します-効率的に

編集:これは、呼び出しが行われる前に毎回外部サービスがまだ存在するかどうかを知る必要がある同様のシナリオでの私の実装でした:

bool IsExternalServiceRunning
    {
        get
        {
            bool isRunning = false;
            try
            {
                var endpoint = new ServiceClient();
                var serviceUri  = endpoint.Endpoint.Address.Uri;
                var request = (HttpWebRequest)WebRequest.Create(serviceUri);
                request.Timeout = 1000000;
                var response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                    isRunning = true;
            }
            #region
            catch (Exception ex)
            {
                // Handle error
            }
            #endregion
            return isRunning;
        }
    }
1
CS Smit

curlを試してみてください。これはLinuxツールであり、Cygwinにもあるはずです。

$ curl http://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

たくさんのオプションがあります。例は 'ネットで見つけることができます。

私が見ているように、2つのオプションがあります。

  • 実行中のサーバーにアクセスできる場合は、すべての呼び出し(およびスローされた例外)をログに記録します。
    ファイルの書き込み中に更新される baretail のようなソフトでログファイルを読み取ります。

  • サーバーにアクセスできない場合は、アクセスできる別のコンピューターにそのログをリモートでWebサービスに書き込むようにする必要があります。
    人気のあるロガーにはこの機能が組み込まれています。( Log4Net 、...)

0
Louis Kottmann
0
Ralf de Kleine