HTTPステータスコード0-エラードメイン= NSURLErrorDomain?


94

私はiOSプロジェクトに取り組んでいます。

このアプリケーションでは、サーバーから画像をダウンロードしています。

問題:

画像のダウンロード中に、リクエストタイムアウトが発生します。ドキュメントによると、リクエストタイムアウトのHTTPステータスコードは408です。

しかし、私のアプリケーションで0は、次のエラーでHTTPステータスコードを取得しています

エラードメイン= NSURLErrorDomainコード= -1001「要求がタイムアウトしました。」UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg、NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg、NSLocalizedDescription =リクエストがタイムアウトしました。、NSUnderlyingError = 0x13846870 "リクエストがタイムアウトしました。"}

インターネットでの検索中に、HTTPステータスコード0に関する情報が見つかりませんでした。

誰かがこれを私に説明できますか?


1
混合コンテンツ が原因で発生することもありますdeveloper.mozilla.org/en-US/docs/Web/Security/Mixed_content
devasghar

回答:


96

HTTPステータスコード0はありません。表示されているのは、使用しているAPI /ライブラリから返された0です。そのためのドキュメントを確認する必要があります。


7
IE10には奇妙なバグがあり、ステータスコード401または403を受け取ると、ステータスコード0として解釈されます。私の頭では、明らかに何かが間違っているため、ステータスコード0はエラーです。
Gaui

5
ゲートウェイタイムアウトは、httpエラーコールバックで角度
status

答えは間違っています。ブラウザがサーバーに接続できない場合、ステータスコード0が存在します。たとえば504などの異なるエラーが発生した場合、これはリバースプロキシ設定が原因です。
Nickon

正解です。HTTPステータスコード0はありません。APIからの戻り値として表示される場合がありますが、HTTP応答メッセージ内では発生しません。
Julian Reschke

74

NSHTTPURLResponseオブジェクトのステータスコード0は、通常、応答がなかったことを意味し、さまざまな理由で発生する可能性があります。これは有効なHTTPステータスコードではないため、サーバーはステータス0を返しません。

あなたのケースでは、あなたがされて表示されます、リクエストがタイムアウトしていて、0がプロパティのデフォルト値にすぎないため、ステータスコード0を取得してます。タイムアウト自体は、サーバーが単に時間内に応答しない、ファイアウォールによってブロックされている、ネットワーク接続全体がダウンしているなど、さまざまな理由が考えられます。通常、後者の場合、電話はネットワーク接続がなく、すぐに失敗することを認識できるほどスマートです。ただし、明らかにステータスコード0で失敗します。

ステータスコードが0の場合、実際のエラーはNSErrorでなく、返されたオブジェクトでキャプチャされることに注意してくださいNSHTTPURLResponse

408私の経験では、HTTPステータスはほとんどありません。私は自分に出会ったことがありません。しかし、クライアントがサーバーへのアクティブなソケット接続を維持する必要があり、サーバーがオープンソケット経由でより多くのデータを送信するためにクライアントを待機している場合に、明らかに使用されますが、一定の時間内にサーバーは接続を408ステータスコードで終了し、基本的にクライアントに「時間がかかりすぎた」と伝えます。


1
完璧な説明。
CouchDeveloper

これは受け入れられた回答である必要があります
Cyrus Dsouza



5

私の限られた経験から、次の2つのシナリオが応答を引き起こす可能性があるstatus code: 0と思います。彼らはもっと多いかもしれませんが、私はそれらの2つを知っています:

  • 接続の応答が遅い可能性があります。
  • または、バックエンドサーバーが利用できない可能性があります。

問題は、status: 0少し一般的で、空の応答本文をトリガーするより多くのユースケースになる可能性があります。


これはAPIステータスであり、HTTPステータスではありません。HTTP応答がない場合、HTTPステータスコードはありませんでした。
ローンの侯爵

ステータスコード0はHTTP応答コードがあることを意味しませんが、サーバーが利用できない場合は問題である可能性があります。
Ravi

5

ステータスコード「0」は、次の3つの理由で 発生する可能性があります
。1)クライアントがサーバーに接続できない
2)クライアントタイムアウト期間内に 応答を受信できない
3)要求がクライアントによって「停止(中止)」された。

しかし、これらの3つの理由は標準化されていません


その上で何か情報源はありますか?
rgoliveira

最初の2つのポイントをテストするために任意のソースコードを適用できます。Ajaxベースのリクエストが必要です。しかし、3番目はユーザーリクエストのキャンセル時に発生します。これはjqueryのabort関数によって実行できます。
Hariprasath Yadav

4

HTTP応答0は標準のHTTP応答ではありません。しかし、クライアントがサーバーに接続できなかったため、タイムアウトが発生したことを示しています。


2

エラーが発生しました:

GET http://localhost/pathToWebSite/somePage.aspxでhttp.status:0エラーが発生する

この呼び出しはVBSファイルを呼び出すWindowsタスクから行われるため、問題をトラブルシューティングするために、ブラウザーにURLを指定するとプライバシーエラーが発生します。

接続はプライベートではありません

攻撃者は、ローカルホストから情報(パスワード、メッセージ、クレジットカードなど)を盗もうとしている可能性があります。NET :: ERR_CERT_COMMON_NAME_INVALID

起こりうるセキュリティインシデントの詳細を自動的にGoogleに報告します。プライバシーポリシー安全性に戻るこのサーバーはローカルホストであることを証明できませんでした。そのセキュリティ証明書は* .ourdomain.comからのものです。これは、設定の誤りまたは攻撃者が接続を妨害していることが原因である可能性があります。もっと詳しく知る。

これは、接続でhttpsを使用するように強制するIIS URL書き換えルールが設定されているためです。このルールはhttp:// localhosthttps:// localhostに誘導ますが、SSL証明書はlocalhostではなく、外部に面しているドメイン名に基づいているため、ステータスコード0として報告されるエラーです。このステータスコードは0です。

この場合の解決策は、localhostのルールに例外を追加し、http://localhost/pathToWebSite/somePage.aspxがhttpを使用できるようにすることでした。あいまいです、はい、でも私は来年この問題に遭遇し、今ではグーグル検索で私の答えを見つけます。


2

ネットワークで404、401、500などのエラーステータスが表示されても、ブラウザはステータスが0に設定されているエラーオブジェクトでhttpエラーハンドラに応答することがあります。

これは、アプリケーションとAPIが異なるドメインにある場合に発生する可能性があります-CORSメカニズムが適用されます。各APIリクエストのCORSによると、ブラウザは2つのリクエストを送信します。

  1. APIがActual / Originリクエストを許可するかどうかを理解するためのプリフライトOPTIONSリクエスト。
  2. APIが許可する場合(OPTIOSリクエストはステータス204と正しいAccess-Control-Allow-Originヘッダーで応答します)-ブラウザーは次の「実際の/元のリクエスト」を送信します。

アプリケーションでは、「実際の/元のリクエスト」のエラー応答を処理しています。「プリフライトOPTIONSリクエスト」が失敗した場合-ブラウザは、httpエラーハンドラに正しいHttpErrorオブジェクトを提供しません。したがって、http応答の正しいステータスを取得するには、必ずプリフライトOPTIONSリクエストの成功応答を取得してください。




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.