iOS SDWebImage NSURLErrorDomain ошибка 406 еще до того, как он свяжется с сервером, почему?

Я написал WS, и одна из вещей, которые он предоставляет, - это аватары (загрузка и сервер). Единственная проблема заключается в том, что каждый раз, когда я пытаюсь получить доступ к одному из них с помощью SDWebImage (UIButton + SDWebImage), я получаю указанную выше ошибку в своем обработчике завершения. Полная ошибка: (Error Domain = NSURLErrorDomain Code = 406 "Операция не может быть завершена. (NSURLErrorDomain ошибка 406.)" ) Странно то, что к серверу никогда не прикасаются (войдите в систему, чтобы проверить это)! Любые идеи, что может быть причиной этого и как это исправить?

PS Если я NSLog зарегистрирую URL-адрес, а затем скопирую и вставлю его в браузер, он отлично работает, так что это что-то с SDWebImage или iOS.

ИЗМЕНИТЬ Код, о котором идет речь:

[btn setBackgroundImageWithURL:url forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@"user-empty.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                    if (error) {
                        NSLog(@"error loading image:%@",error);
                        return;
                    }
                    NSLog(@"image should be loaded");
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [btn setBackgroundImage:image forState:UIControlStateHighlighted];
                    });
                }];

Что касается URL, я бы предпочел не делиться им, так как у нас нет доменного имени в данный момент, и я не хочу выдавать ip сервера моего клиента... Я уверен, что вы понимаете, но вот URL-адрес без правильного IP-адреса (обратите внимание, что мне пришлось добавить пробелы для публикации правок, их нет в фактическом URL-адресе): http:// 192 .168 .1 .21/uploads/51078f979c966bde0b000009/avatar.png

Может ли это быть что-то с моим WS? что-то с заголовками или что-то в этом роде? Я знаю, что он отправляет обратно тип контента «image/png», если это помогает, и, как я уже сказал, он отлично работает в браузере. Может быть дело в том, что это ip вместо доменного имени?

ОБНОВЛЕНИЕ Мы настроили доменное имя, но оно все еще не работает, поэтому вот ссылка, которая будет работать в браузере, но не в SDWebImage или AFNetworking: http://communication.notitlabs.co/uploads/511db303367885c248000015/avatar.png


person Matthew Clark    schedule 29.01.2013    source источник
comment
Не могли бы вы показать нам какой-нибудь код? Без него сложно понять, что происходит.   -  person Firo    schedule 30.01.2013
comment
URL тоже будет полезен.   -  person Lance    schedule 30.01.2013
comment
Вы решили это? Я вижу ту же проблему.   -  person Jonny    schedule 09.08.2017
comment
IIRC, это была проблема с отправкой сервером изображения с неправильным типом mime. Хотя прошло уже 4 года^^; Прости   -  person Matthew Clark    schedule 11.08.2017


Ответы (2)


Если у вас действительно есть ошибка HTTP 406, прочитайте об этом здесь — похоже на проблему с HTTP-заголовки.

Однако, чтобы быть уверенным, вам нужно посмотреть на свойство code объекта NSError и сопоставить его с одним из этих кодов ошибок из Справочник по константам Foundation:

   NSURLErrorUnknown = -1,
   NSURLErrorCancelled = -999,
   NSURLErrorBadURL = -1000,
   NSURLErrorTimedOut = -1001,
   NSURLErrorUnsupportedURL = -1002,
   NSURLErrorCannotFindHost = -1003,
   NSURLErrorCannotConnectToHost = -1004,
   NSURLErrorDataLengthExceedsMaximum = -1103,
   NSURLErrorNetworkConnectionLost = -1005,
   NSURLErrorDNSLookupFailed = -1006,
   NSURLErrorHTTPTooManyRedirects = -1007,
   NSURLErrorResourceUnavailable = -1008,
   NSURLErrorNotConnectedToInternet = -1009,
   NSURLErrorRedirectToNonExistentLocation = -1010,
   NSURLErrorBadServerResponse = -1011,
   NSURLErrorUserCancelledAuthentication = -1012,
   NSURLErrorUserAuthenticationRequired = -1013,
   NSURLErrorZeroByteResource = -1014,
   NSURLErrorCannotDecodeRawData = -1015,
   NSURLErrorCannotDecodeContentData = -1016,
   NSURLErrorCannotParseResponse = -1017,
   NSURLErrorInternationalRoamingOff = -1018,
   NSURLErrorCallIsActive = -1019,
   NSURLErrorDataNotAllowed = -1020,
   NSURLErrorRequestBodyStreamExhausted = -1021,
   NSURLErrorFileDoesNotExist = -1100,
   NSURLErrorFileIsDirectory = -1101,
   NSURLErrorNoPermissionsToReadFile = -1102,
   NSURLErrorSecureConnectionFailed = -1200,
   NSURLErrorServerCertificateHasBadDate = -1201,
   NSURLErrorServerCertificateUntrusted = -1202,
   NSURLErrorServerCertificateHasUnknownRoot = -1203,
   NSURLErrorServerCertificateNotYetValid = -1204,
   NSURLErrorClientCertificateRejected = -1205,
   NSURLErrorClientCertificateRequired = -1206,
   NSURLErrorCannotLoadFromNetwork = -2000,
   NSURLErrorCannotCreateFile = -3000,
   NSURLErrorCannotOpenFile = -3001,
   NSURLErrorCannotCloseFile = -3002,
   NSURLErrorCannotWriteToFile = -3003,
   NSURLErrorCannotRemoveFile = -3004,
   NSURLErrorCannotMoveFile = -3005,
   NSURLErrorDownloadDecodingFailedMidStream = -3006,
   NSURLErrorDownloadDecodingFailedToComplete = -3007
person Aaron Brager    schedule 14.02.2013
comment
он получает 406, но, как я уже сказал, он на самом деле не разговаривает с сервером... Я могу заставить его работать с другой библиотекой... но я хотел бы придерживаться SDWebImage из-за кэширования, если это вообще возможно . - person Matthew Clark; 14.02.2013
comment
Если он на самом деле не разговаривает с сервером, то это не настоящий 406. Ошибка 406 будет выдана с сервера. - person Aaron Brager; 14.02.2013
comment
это вроде то, что я говорил. Я думаю, что либа просто убивает запрос и говорит 406, это также происходит с AFNetworking, но не с Nimbus или в браузере... это чертовски странно... - person Matthew Clark; 15.02.2013
comment
Домен ошибки = NSURLErrorDomain Code = 406 Операция не может быть завершена. (Ошибка NSURLErrorDomain 406.) - person Matthew Clark; 15.02.2013
comment
О, да, вот что я получаю за скимминг. :) Если не подключается к серверу, а вы подключены к интернету, то что-то не так с вашим запросом. Если вы po [url absoluteString] видите ли вы то, что ожидаете? - person Aaron Brager; 15.02.2013

Просто вызовите этот код перед .sd_setImage и т. д.:

SDWebImageDownloader.shared().setValue("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", forHTTPHeaderField: "Accept")

Не могу сказать точно, но это похоже на ошибку в SDWebImage? Это немного странно, потому что один и тот же код будет работать для одного домена/пути, но не для другого...

person Rabie    schedule 29.06.2018