私はiOSプロジェクトに取り組んでいます。
このアプリケーションでは、サーバーから画像をダウンロードしています。
問題:
画像をダウンロードしている間に私が取得しています Request Timeout 。ドキュメントによると、リクエストタイムアウトのHTTPステータスコードは408
です。
しかし、私のアプリケーションでは、HTTPステータスコード0
を次のエラーで受け取ります。
"エラードメイン= NSURLErrorDomain Code = -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 Status Code 0に関する情報が見つかりませんでした。
誰かが私にこれを説明できますか?
HTTPステータスコード0はありません。表示されるのは、使用しているAPI /ライブラリから返された0です。そのためにはドキュメントを確認する必要があります。
NSHTTPURLResponse
オブジェクトの状況コード0は、一般に応答がなかったことを意味し、さまざまな理由で発生する可能性があります。これは有効なHTTPステータスコードではないため、サーバーはステータス0を決して返しません。
あなたの場合は、リクエストがタイムアウトして0がプロパティのデフォルト値にすぎないので、ステータスコード0を取得するのは表示されているです。タイムアウト自体は、サーバーが単純に時間内に応答しない、ファイアウォールによってブロックされている、ネットワーク接続全体が停止しているなど、さまざまな理由が考えられます。通常後者の場合、電話はそれがネットワーク接続を持っていないことを知るのに十分スマートで、すぐに失敗するでしょう。ただし、見かけのステータスコード0で失敗します。
ステータスコードが0の場合、実際のエラーはNSError
ではなく、返されたNSHTTPURLResponse
オブジェクトに記録されます。
私の経験では、HTTPステータスの408
はあまり一般的ではありません。私は自分と出会ったことがない。しかし、クライアントがサーバーへのアクティブなソケット接続を維持する必要があり、サーバーがオープンソケットを介してより多くのデータを送信するためにクライアントを待機している場合に使用されますサーバーは408
ステータスコードで接続を終了し、基本的にクライアントに「時間がかかり過ぎた」と伝えます。
IOS SDKの場合あなたのAPIがタイムアウトすると、あなたはそのためにステータス0を得ます。
応答は空でした。ほとんどの場合、コードは1xx、2xx、3xx、4xx、5xxと表示されます。
私の限られた経験から、私は次の2つのシナリオがstatus code: 0
の応答を引き起こす可能性があることを思い出してください。それらはもっとあるかもしれませんが、私はそれら2つを知っています:
つまり、status: 0
は少し一般的なもので、空のレスポンスボディをトリガーするより多くのユースケースになる可能性があります。
HTTPレスポンス0は標準のHTTPレスポンスではありません。しかし、クライアントがサーバーに接続できなかったためにタイムアウトが発生したことを示しています。
エラーが発生しました。
GET http://localhost/pathToWebSite/somePage.aspx http.status:0エラーが発生しました
その呼び出しは、VBSファイルを呼び出すWindowsタスクから行われるので、問題をトラブルシューティングするために、URLをブラウザに向け、プライバシーエラーを受け取ります。
あなたのつながりは非公開です
攻撃者があなたの情報をlocalhostから盗もうとしている可能性があります(パスワード、メッセージ、クレジットカードなど)。 NET :: ERR_CERT_COMMON_NAME_INVALID
潜在的なセキュリティ問題の詳細を自動的にGoogleに報告します。プライバシーポリシー安全性に戻るこのサーバーはローカルホストであることを証明できませんでした。そのセキュリティ証明書は* .ourdomain.comからのものです。これは、設定の誤りや攻撃者が接続を傍受したことが原因である可能性があります。もっと詳しく知る。
これは、接続にhttpsを使用させるためのIIS URL書き換えルールが設定されているためです。そのルールは http:// localhost から https:// localhost に転換しますが、私たちのSSL証明書はlocalhostではなく外向きのドメイン名に基づいているため、次のように報告されます。そのため、プライバシーエラーがこのステータスコード0の非常にあいまいな理由になる可能性があります。
私たちの場合の解決策はlocalhostのルールに例外を追加し、 http://localhost/pathToWebSite/somePage.aspx にhttpを使用させることでした。あいまいな、はい、しかし私は来年この年に遭遇し、今私はグーグル検索で私の答えを見つけるでしょう。
ステータスコード '0'は、の理由で発生する可能性があります
1)クライアントサーバーに接続できません
2)クライアント応答を受信できないタイムアウト期間内
3)要求はクライアントによって"停止(中止)"されました。
しかし、これら3つの理由は標準化されていません
私の場合はCORSです。
私は一度iOSアプリでそのような反応をしました。解決策は、ヘッダにAccess-Control-Allow-Origin: *
がないことでした。
もっと: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
ゲートウェイタイムアウトでは、ステータスはエラーコールバックでゼロになります。
.error( function( data,status,headers,config){
console.log(status)
}
私は、Javaスクリプトajaxクライアントとnodejs Expressアプリケーションサーバーを持っています。
クライアントコードは次のようになります。
...
var status1 = xmlHttpRequest.status;
...
サーバーコードは次のようになります。
...
// An exception here results HTTP status codes in status1 (at client side above)
...
...
var reqDb = http.request(options, requestCompleteCallback);
...
...
function requestCompleteCallback(response) {
...
// An exception here results in 0 in status1 (at client side above)
...
}
これを理解するための30分の苦労。
この記事が誰かに役立つことを願っています。
頑張ってください。
あなたがネットワークで404、401、500等のエラーステータスを見ることができるとしても時々ブラウザはステータスを0に設定したError Objectでhttpエラーハンドラに応答します。
アプリケーションとAPIが異なるドメインにある場合、これが発生する可能性があります - CORSメカニズムが適用されます。各APIリクエストのCORSによると、ブラウザは2つのリクエストを送信します。
アプリケーションでは、 "Actual/Origin request"のエラー応答を処理しています。 "preflight OPTIONS request"が失敗した場合 - ブラウザはhttpエラーハンドラに対して正しいHttpErrorオブジェクトを提供しません。 httpレスポンスの正しいステータスを取得するために - 成功プリフライトOPTIONSリクエストレスポンスを取得するようにしてください。