web-dev-qa-db-ja.com

0のHttpStatusCodeを取得する

クライアントが接続しているサービスを不正なURLにポイントすると、HttpStatusCodeが0になるのはなぜですか。

私のstatusCodeAsIntが0として表示されています。なぜ404として表示されず、処理されないのですか?

IRestResponse response = client.Execute(restReq);
HttpStatusCode statusCode = response.StatusCode;

var statusCodeAsInt = (int) statusCode;

        if (statusCodeAsInt >= 500)
        {
            throw new InvalidOperationException("A server error occurred: " + response.ErrorMessage, response.ErrorException);
        }
        if (statusCodeAsInt >= 400)
        {
            throw new InvalidOperationException("Request could not be understood by the server: " + response.ErrorMessage,
                response.ErrorException);
        }

このRestResponseを処理する適切な方法は何ですか?

16
obizues

応答コード0は、通常、応答が空であることを意味します。つまり、ヘッダーも返されませんでした。

これは通常、接続が受け入れられ、正常に閉じられたときに発生します。FIN接続とも呼ばれます。これは、サーバーへのブロードキャストが終了したことをサーバーが示している場所ですが、引き続き新しいメッセージをリッスンします。 ファイアウォールの問題である可能性があります。

もう1つのことは、IRestResponseRestResponseに変更することです。 IRestResponseを使用しても、このシナリオでは利点はありません。

14
Neville

私の場合は、StatusCodeが0になるファイアウォールの問題ではありませんでした。TLS1.0接続をブロックしたサーバーで、TLS 1.0をまだ使用しているレガシーアプリを使用していました。 TLS 1.2を有効にすると、期待していたステータスコードを取得しました。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
13
KJ3

ステータスコード0は、ステータスコードがないことを意味すると思います。エラーが応答ではなくRestSharpにあったことも意味します。ステータスコードが0の場合、リクエストが送信されていない可能性もあります。

.ErrorException/.ErrorMessageをチェックします。

6
Chris McCowan

私の場合、無効なホスト名を指定しただけです。

0
lucidbrot