1

ファイルをダウンロードしています(Apache Tomcat 6.0.32を使用)。切断(Tomcatをシャットダウン)すると、ASHITTPRequestがエラーを生成することがありますが、時々(ほとんどの場合正確に...常に正確に!最初に接続がない場合にのみエラーが発生します)、すべて正しいように動作します。

そこで問題があります: なぜこれが起こったのか、接続が適切に失われたかどうかをどのように監視できるのか。

どうもありがとう!

アップデート:

TCPMon を介してリクエストを送信し、それを停止して (TCPMon)、同じ結果を取得してみてください: ASIHTTPRequest は、ダウンロードが正しく行われたと考えています。

アップデート:

応答ヘッダー:

"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";

応答ステータス メッセージ:

 HTTP/1.1 200 OK

アップデート:

コンピューターを手で外した場合 (ケーブルを外した場合)、次のようになります。

ASIHTTPRequest がタイムアウトになるまで待機し、次のリクエストで接続エラーが発生することがあります。

切断するタイミングでエラーが発生することがあります。

切断したときにエラーが発生しないことがあります。ダウンロードの進行状況が表示されず、(再度接続すると)ファイルが最初からダウンロードを開始します。

ポートを閉じると、ASIHTTPRequest はダウンロードが成功したと判断します。

この論理が理解できない…

解決:

ヘッダーの Content-Length と読み取った合計バイト数を比較して、問題を解決します。

 NSString *contentLength = [[self.request responseHeaders] valueForKey:@"Content-Length"];
 NSString *downloadedBytesCount = [NSString stringWithFormat:@"%llu",[self.request totalBytesRead]];


        if ([contentLength isEqualToString:downloadedBytesCount] == NO) {
           // error maintain 
        } 

したがって、すべてのデータを取得したかどうかを確認し、そうでない場合は維持エラーを確認できます。他の場合 (手動で切断するなど) では、ASIHTTPRequest は適切な方法で動作し、自己エラーを生成します。

4

1 に答える 1

1

接続ステータスを確認するために、ASIで到達可能性ライブラリを使用しています。到達可能性にはASIが付属していると思います。

これは私がどこかから取った私のコードではありませんが、完璧に機能しています。

#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];
}

ありがとう。

于 2011-12-18T16:23:20.203 に答える