我正在使用后台传输将照片上传到我的 Web 服务。由于照片上传会消耗大量时间和内存,我认为使用后台传输请求来完成此操作可能是一个好主意。照片上传后,我想获取上传照片的Id,然后用于后期处理。但是,事实证明我不能在后台传输请求中这样做。
据我了解,后台传输仅使用以下逻辑:
您必须获取要上传的文件,然后将其保存/复制到应用程序的独立存储文件夹下:shared/transfers。这是极其重要的。显然,在其他位置使用文件对我不起作用。也许它不是共享/传输,而是“相对”路径。但我会坚持同样的约定。
将文件保存在该位置后,可以基于该位置创建后台请求。除了文件内容之外,您似乎无法传递 POST CONTENT,因此文件名、mime 类型等任何其他参数都需要仅作为 QUERY String 参数传递。我可以理解这一点,但如果我可以将两者都作为 POST 内容传递,那就太好了。我不认为 HTTP 对其工作方式有限制。
下面是一些使用 Hammock 创建请求的代码:
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);
就我而言,我实际上是使用查询字符串传递所有必要的参数。成功保存后,我的 Web 服务会返回我刚刚上传的照片的 ID。但是:没有办法(或至少我知道)获得和评估响应。后台传输请求事件处理程序不公开响应。这是我的事件处理程序:
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的工作示例?