ASIHTTPRequest нет ошибки при потере соединения
Я загружаю файл (с 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 ответ
Для проверки состояния соединения я использую библиотеку 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];
}
Благодарю.