asihttprequest接続の喪失時のエラーなし
-
26-10-2019 - |
質問
ファイルをダウンロードしています(Apache Tomcat 6.0.32を使用)。切断すると、時々Ashittprequestがエラーを生成することがありますが、時には(ほとんどの場合...正確に...最初に接続が発生しない場合にのみ)すべての正しいように機能します。
質問があります。なぜこれが起こったのか、接続が適切に失われた場合にどのように視聴できるのか。
どうもありがとう!
アップデート:
TCPMONを介してリクエストを送信してから、それを停止し(TCPMON)、同じことを取得してみてください。
アップデート:
ResponseHeaders:
"Content-Disposition" = attachment;
"Content-Length" = 2277888;
"Content-Type" = "application/octet-stream";
Date = "Thu, 28 Apr 2011 12:35:32 GMT";
Server = "Apache-Coyote/1.1";
"Set-Cookie" = "JSESSIONID=98CAE6C0C4275B528D5E0F8651546AFE; Path=/ISED";
restonsestatusmessage:
HTTP/1.1 200 OK
アップデート:
コンピューターを手で切断する場合(ケーブルを切断)、これを取得します。
時々ASIHTTPREQUESTがタイムアウトまで待機し、次のリクエストが接続エラーを取得します。
いつかエラーが発生します。
ある時期にエラーは発生しません。
そして、近くのポートAsiHttpRequestがそれが成功したことを考えている場合、ダウンロードが完了しました。
この論理がわかりません...
解決:
ヘッダーのコンテンツ長と合計バイトの読み取りを比較することにより、問題を解決します。
NSString *contentLength = [[self.request responseHeaders] valueForKey:@"Content-Length"];
NSString *downloadedBytesCount = [NSString stringWithFormat:@"%llu",[self.request totalBytesRead]];
if ([contentLength isEqualToString:downloadedBytesCount] == NO) {
// error maintain
}
そのため、すべてのデータを取得したかどうかを確認できます。エラーを維持します。他の場合(手動で切断するなど)asihttprequestは適切な方法で動作し、自己によってエラーを生成します。
解決
接続ステータスをチェックするために、ASIを使用してReachabilityライブラリを使用しています。到達可能性は確かではないと思います。
これは私がどこかから取った鉱山コードではありませんが、完璧に機能しています。
#import "Reachability.h"
-(void)viewDidAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
}
- (void) checkNetworkStatus:(NSNotification *)notice
{
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
NSLog(@"The internet is down.");
//self.internetActive = NO;
break;
}
case ReachableViaWiFi:
{
NSLog(@"The internet is working via WIFI.");
//self.internetActive = YES;
break;
}
case ReachableViaWWAN:
{
NSLog(@"The internet is working via WWAN.");
//self.internetActive = YES;
break;
}
}
}
私は自分のニーズについてコードを少し変更しました。それはyes/noです。ある時点でオブザーバーを削除する必要があります。
- (void)viewDidUnload
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
ありがとう。