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();
4

3 回答 3

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;
}
于 2013-06-12T19:58:49.550 回答
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 方法 (Windows)

  2. IAsyncOperationWithProgress 接口 (Windows)

  3. AsyncOperationWithProgressCompletedHandler 委托 (Windows)

于 2013-03-08T10:52:42.433 回答
0

最近几天我一直在寻找同样的东西,但没有运气。最后发现你不能这样做。您可以获取响应的“标头”,但无法从 BackgroundTransfer getResponseInformation() 方法获取响应的“主体”。

目前这是 Windows 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");
}

希望这会有所帮助。

于 2013-03-22T16:10:49.340 回答