Я использую фоновую передачу для загрузки фотографий в мой веб-сервис. Поскольку загрузка фотографий может занимать значительное время и память, я подумал, что было бы неплохо использовать для этого фоновый запрос на передачу. После того, как фотография загружена, я хочу получить Id загруженной фотографии, а затем использовать ее для последующей обработки. Однако оказывается, что я не могу сделать это в фоновом запросе на передачу.
В моем понимании, Background Transfer работает, используя ТОЛЬКО следующую логику:
Вам необходимо получить файл, который вы хотите загрузить, а затем сохранить / скопировать его в изолированное хранилище вашего приложения в папке: shared / TRANS * . Это чрезвычайно важно. Очевидно, использование файла в другом месте не сработало для меня. Может быть, это не общий ресурс / передача, а «относительный» путь. Но я бы придерживался тех же соглашений.
После того, как вы сохранили файл в этом месте, на его основе может быть создан фоновый запрос. Не похоже, что вы можете передавать POST CONTENT, кроме содержимого файла, поэтому любые другие параметры, такие как имя файла, тип mime и т. Д., Нужно будет передавать только как параметры строки QUERY. Я могу это понять, но было бы неплохо, если бы я мог передать оба из них как POST Content. Я не думаю, что HTTP имеет ограничение на то, как это работает.
Вот некоторый код для создания запроса с использованием гамака:
string url = App.ZineServiceAuthority + "articles/save-blob?ContainerName={0}&MimeType={1}&ZineId={2}&Notes={3}&IsPrivate={4}&FileName={5}";
url = String.Format(url, userId, "image/jpg", ZineId, txtStatus.Text, true, UploadFileName);
var btr = new BackgroundTransferRequest(new Uri(url, UriKind.Absolute));
btr.TransferPreferences = TransferPreferences.AllowCellularAndBattery;
btr.Method = "POST";
btr.Headers.Add("token", IsolatedStorageHelper.GetTravzineToken());
btr.UploadLocation = new Uri(@"/shared\transfers/" + UploadFileName, UriKind.Relative);
btr.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(btr_TransferStatusChanged);
btr.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(btr_TransferProgressChanged);
BackgroundTransferService.Add(btr);
В моем случае я буквально передаю все необходимые параметры, используя строку запроса. При успешном сохранении мой веб-сервис возвращает идентификатор фотографии, которую я только что загрузил. Тем не мение:
НЕТ (или, по крайней мере, я знаю) НЕТ способа получить и оценить ОТВЕТ. Обработчики событий запроса на фоновую передачу не предоставляют RESPONSE.
Вот мои обработчики событий:
void btr_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
{
bool isUploading = e.Request.TotalBytesToSend > 0 ? true : false;
lblStatus.Text = isUploading ? "Uploading" + e.Request.BytesSent.ToString() + " sent" : "Done";
}
void btr_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
{
if (e.Request.TransferStatus == TransferStatus.Completed)
{
using (IsolatedStorageFile iso =
IsolatedStorageFile.GetUserStoreForApplication())
{
if (iso.FileExists(e.Request.UploadLocation.OriginalString))
iso.DeleteFile(e.Request.UploadLocation.OriginalString);
}
BackgroundTransferService.Remove(e.Request);
if (null != e.Request.TransferError)
{
MessageBox.Show(e.Request.TransferError.Message);
}
else
{
lblStatus.Text = "Done baby done";
}
}
}
Итак, теперь мой вопрос: как кто-нибудь может выполнять какую-либо POST-обработку в таких сценариях?
Может ли кто-нибудь сказать мне направление мысли о создании такого негибкого класса?
Любые мысли о том, как я мог обойти эту проблему, будут оценены.
Кроме того, есть ли у кого-нибудь рабочие примеры отечественного BackgroundTransfer?