ASIHTTPRequest нет ошибки при потере соединения - PullRequest
1 голос
/ 28 апреля 2011

Я загружаю файл (с Apache Tomcat 6.0.32).Когда я делаю отключение (shutdown tomcat) несколько раз, ASHITTPRequest генерирует ошибку, но иногда (в большинстве случаев точно ... ВСЕ ВРЕМЯ ТОЧНО! Только при отсутствии соединения в начале возникает ошибка) он завершает работу, как все правильно.

Таким образом, возникает вопрос: почему это произошло и как я могу наблюдать, если соединение потеряно правильно.

Большое спасибо!

ОБНОВЛЕНИЕ:

Попробуйте отправитьзапросите через TCPMon, затем остановите его (TCPMon) и получите то же самое: ASIHTTPRequest считает, что загрузка выполнена правильно.

ОБНОВЛЕНИЕ:

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

responseStatusMessage:

 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 работает соответствующим образом и выдает ошибки самостоятельно.

1 Ответ

1 голос
/ 18 декабря 2011

для проверки состояния соединения я использую библиотеку Reachability с 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;
        }
    }
}

Я немного изменил код относительно моих потребностей, он возвращает ДА ​​/ НЕТ. и вы должны удалить наблюдателя в какой-то момент.

- (void)viewDidUnload
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

спасибо.

...