2013-03-08 2 views
3

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

  BackgroundUploader uploader = new BackgroundUploader(); 
      uploader.SetRequestHeader("Content-Disposition", "form-data"); 
      uploader.SetRequestHeader("name", "userfile"); 
      uploader.SetRequestHeader("filename", App.ViewModel.DeviceId + ".png"); 
      uploader.SetRequestHeader("Content-Type", "multipart/form-data"); 

      UploadOperation upload = uploader.CreateUpload(uri, file); 
      await upload.StartAsync(); 
+0

Как в стороне, App.ViewModel.DeviceId является лично идентифицируемой информацией. Я бы рассмотрел использование другого уникального идентификатора. – TookTheRook

ответ

1
upload.StartAsync().Completed = UploadCompletedHandler; 

...

void UploadCompletedHandler(IAsyncOperationWithProgress<TResult, TProgress> asyncInfo, 
    AsyncStatus asyncStatus) 
{ 
    // get a response body from an asyncInfo using the asyncInfo.GetResults() method 
} 

Выполните эти ресурсы:

  1. UploadOperation.StartAsync | startAsync Method (Windows)

  2. IAsyncOperationWithProgress Interface (Windows)

  3. AsyncOperationWithProgressCompletedHandler Delegate (Windows)

+0

Я не понимаю, как это позволит вам получить тело ответа? – Sandy

+0

@Sandy Я отредактировал это сообщение. – Warlock

0

Я искал то же самое, за последние несколько дней, и не повезло. Наконец обнаружил, что вы не можете этого сделать. Вы можете получить «заголовки» ответа, но нет способа получить «тело» ответа от метода backgroundTransfer getResponseInformation().

В настоящее время это ограничение API окон. Надеюсь, они скоро это добавят.

http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.backgroundtransfer.responseinformation.aspx#properties

Для устранения этой проблемы вы можете добавить свой собственный заголовок в ответе. Для этого вам нужно изменить скрипт на стороне сервера. Но если у вас нет контроля над сценарием на стороне сервера, используйте прокси-скрипт, который будет осуществлять связь между вашим приложением и удаленным сервером. Для моего случая я создал прокси-скрипт в php, который обменивается данными с удаленным сервером, и после получения ответа я добавляю его в специальный заголовочный ключ.

Затем в приложении в вашем полном методе используйте:

function complete(e){ 
    var mykey = e.getResponseInformation().headers.lookup("mykey"); 
} 

Надеется, что поможет.

7

Я пришел к следующему из них, заметив, что в моем загрузочном объекте были BytesReceived.

async private Task<string> GetUploadResponseBody(UploadOperation operation) 
{ 
    string responseBody = string.Empty; 
    using (var response = operation.GetResultStreamAt(0)) 
    { 
     uint size = (uint)operation.Progress.BytesReceived; 
     IBuffer buffer = new Windows.Storage.Streams.Buffer(size); 
     var f = await response.ReadAsync(buffer, size, InputStreamOptions.None); 

      using (var dr = DataReader.FromBuffer(f)) 
      { 
       responseBody = dr.ReadString(dr.UnconsumedBufferLength); 
      }     
    } 
    return responseBody; 
} 
+0

Этот definatley работает, но время от времени мы получаем System.ArgumentOutOfRangeException: «На целевой многобайтовой кодовой странице нет отображения для символа Unicode». Кажется, что ответ (в данном случае OneDrive) не всегда является правильной строкой. Вы наткнулись на это и случайно знаете обходное решение? – Amenti

Смежные вопросы