2014-09-24 2 views
2

Я использую NSUrlSession для iOS 7.1 на некоторое время, загружаемые и загружаемые файлы работают исправно. После обновления тестового устройства до iOS 8 загрузка и загрузка уже работают.Xamarin.iOS NSUrlSession не работает на iOS 8

Я изменил создание объекта NSUrlSessionConfiguration.

 if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) 
     { 
      configUpload = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(this.urlSessionIdUpload); 
     } 
     else 
     { 
      configDownload = NSUrlSessionConfiguration.BackgroundSessionConfiguration(this.urlSessionIdDownload); 
     } 
     configUpload.TimeoutIntervalForResource = 30.0; 
     configUpload.TimeoutIntervalForRequest = 30.0; 
     this.uploadSession = NSUrlSession.FromConfiguration(configUpload, new UploadDelegate(this), new NSOperationQueue()); 

После этой модификации мое приложение iOS 7 все еще работает, никаких проблем вообще. Но на iOS 8 он показывает какое-то странное поведение. Я использую точно ту же конечную точку и не изменяю часть, которая создает задачу Up/Download.

   NSUrl uploadHandlerUrl = NSUrl.FromString("MY URL IS HERE"); 
       NSMutableUrlRequest request = new NSMutableUrlRequest(uploadHandlerUrl); 
       request.HttpMethod = "POST"; 
       request["Content-Type"] = "application/octet-stream"; 
       request["Transfer-Encoding"] = "chunked"; 

       NSUrlSessionUploadTask uploadTask = uploadSession.CreateUploadTask(request, fileUrl); 

ФайлUrl указывает на (локальный) файл, который должен быть загружен. Затем я запускаю задачу в каком-то другом классе.

public override void Start() 
    { 
     this.task.Resume(); 
    } 

После завершения загрузки будет вызываться следующий код.

public async override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error) 
    { 
     if (error != null) 
     { 
      this.InvokeOnMainThread(() => this.controller.WriteLog("Completed TaskIdentifier: " + task.TaskIdentifier + " Error: " + error.LocalizedDescription)); 
      this.InvokeOnMainThread(() => this.controller.TaskFailed("upload_" + task.TaskIdentifier)); 
      this.InvokeOnMainThread(() => this.controller.UploadFailed(task)); 
     } 
     else 
     { 
      this.InvokeOnMainThread(() => this.controller.TaskSucceeded("upload_" + task.TaskIdentifier)); 
      this.InvokeOnMainThread(() => this.controller.WriteLog("Completed TaskIdentifier: " + task.TaskIdentifier)); 
     } 
    } 

При попытке загрузить файл присутствуют два разных сценария. -Установка очень маленького изображения: загрузка завершена без ошибки в моем делегате. Он показывает, что он загружен успешно, но когда я смотрю в ответ сервера, я вижу результат 400 Http.

2014-09-24 11:33:20.441 BackgroundTransferService[346:17701] 2014-09-24:11.33.19 : Server Request: https://xxxxxxxxxx/json/UploadFile?name=file_dbafdcf2-c36e-47d7-9262-bcde8bfb316d.jpg&i=0 
2014-09-24 11:33:20.441 BackgroundTransferService[346:17701] 2014-09-24:11.33.19 : Request Headers: [Transfer-Encoding, chunked] 
2014-09-24 11:33:20.442 BackgroundTransferService[346:17701] 2014-09-24:11.33.19 : Request Headers: [Content-Type, application/octet-stream] 
2014-09-24 11:33:20.442 BackgroundTransferService[346:17701] 2014-09-24:11.33.19 : Request Method: POST 
2014-09-24 11:33:20.443 BackgroundTransferService[346:17701] 2014-09-24:11.33.19 : Server Response: <NSHTTPURLResponse: 0x16e364d0> { URL: https://xxxxxxxxxxxxxxx/json/UploadFile?name=file_dbafdcf2-c36e-47d7-9262-bcde8bfb316d.jpg&i=0 } { status code: 400, headers { 
2014-09-24 11:33:20.444 BackgroundTransferService[346:17701]  Connection = close; 
2014-09-24 11:33:20.444 BackgroundTransferService[346:17701]  "Content-Length" = 374; 
2014-09-24 11:33:20.444 BackgroundTransferService[346:17701]  "Content-Type" = "text/html; charset=us-ascii"; 
2014-09-24 11:33:20.445 BackgroundTransferService[346:17701]  Date = "Wed, 24 Sep 2014 09:28:10 GMT"; 
2014-09-24 11:33:20.445 BackgroundTransferService[346:17701]  Server = "Microsoft-HTTPAPI/2.0"; 

Когда я запускаю этот запрос на моей прошивке 7 устройства оно работает:

2014-09-24 11:32:15.815 BackgroundTransferService[4219:60b] 2014-09-24:11.32.10 : Server Request: https://xxxxxxxxxxxx/json/UploadFile?name=file_c92bd2df-267a-4533-9e4d-1644685b6b91.jpg&i=0 
2014-09-24 11:32:15.817 BackgroundTransferService[4219:60b] 2014-09-24:11.32.10 : Server Headers: [Transfer-Encoding, chunked] 
2014-09-24 11:32:15.818 BackgroundTransferService[4219:60b] 2014-09-24:11.32.10 : Server Headers: [Content-Type, application/octet-stream] 
2014-09-24 11:32:15.819 BackgroundTransferService[4219:60b] 2014-09-24:11.32.10 : Request Method: POST 
2014-09-24 11:32:15.820 BackgroundTransferService[4219:60b] 2014-09-24:11.32.10 : Server Response: <NSHTTPURLResponse: 0x176f7040> { URL: https://xxxxxxxxxxxx/json/UploadFile?name=file_c92bd2df-267a-4533-9e4d-1644685b6b91.jpg&i=0 } { status code: 200, headers { 
2014-09-24 11:32:15.821 BackgroundTransferService[4219:60b]  "Cache-Control" = private; 
2014-09-24 11:32:15.823 BackgroundTransferService[4219:60b]  "Content-Encoding" = gzip; 
2014-09-24 11:32:15.824 BackgroundTransferService[4219:60b]  "Content-Type" = "application/json; charset=utf-8"; 
2014-09-24 11:32:15.825 BackgroundTransferService[4219:60b]  Date = "Wed, 24 Sep 2014 09:30:44 GMT"; 
2014-09-24 11:32:15.826 BackgroundTransferService[4219:60b]  Server = "Microsoft-IIS/8.0"; 
2014-09-24 11:32:15.827 BackgroundTransferService[4219:60b]  "Transfer-Encoding" = Identity; 
2014-09-24 11:32:15.828 BackgroundTransferService[4219:60b]  Vary = "Accept-Encoding"; 
2014-09-24 11:32:15.829 BackgroundTransferService[4219:60b]  "X-AspNet-Version" = "4.0.30319"; 
2014-09-24 11:32:15.830 BackgroundTransferService[4219:60b]  "X-Powered-By" = "ASP.NET"; 
2014-09-24 11:32:15.831 BackgroundTransferService[4219:60b] } } 
2014-09-24 11:33:20.446 BackgroundTransferService[346:17701] } } 

Второй сценарий происходит, когда я пытаюсь загрузить файл большего размер. Моя загрузка останавливается в определенный момент, и после этого время истекает. Это приведет к вызову делегата DidCompleteWithError с сообщением об ошибке, в котором указано его время ожидания.

Для части загрузки; это дает мне ошибку, что конечная точка не найдена.

Во всех сценариях; похоже, что мой сервер даже не попал. Это не создание журналов, что-то случилось вообще.

Чтобы все было ясно; Я использую точно такой же исходный код для создания моего приложения. Я только меняю цель развертывания для соответствия правильному устройству. Конечные точки также не изменяются.

У кого-нибудь есть ключ к тому, что вызывает все эти проблемы?

Обновление 1 Проблема с загрузкой решена. Проблема была вызвана механизмом loggin, который не смог получить конец потока загрузки.

Загрузка не работает.

Update 2: Решение Наконец нашел вопрос, что послужило причиной добавления к сбою в прошивкой 8.

request["Transfer-Encoding"] = "chunked" 

Используя этот заголовок в IOS 7 не вызывает никаких проблем. Использование этого заголовка в iOS 8 вызывает плохой запрос на сервер.

+1

Используете ли вы последний стабильный выпуск для Xamarin.iOS (8.0.0.62)? –

+0

Я использую 8.0.0.52. Не получил обновления для 8.0.0.62. С этим тоже: http://forums.xamarin.com/discussion/24733/xamarin-ios-versions-are-not-in-sync-on-the-latest-pc-version-versus-the-latest-mac- book-pro –

+0

У вас есть 8.0.0.52 на Mac или Windows? (Важный на mac) –

ответ

2

Проблема была решена путем удаления этой строки:

request["Transfer-Encoding"] = "chunked" 

Работал на iOS7, но не в iOS8.