上传文件后如何获取响应流

时间:2013-03-08 10:42:15

标签: c# microsoft-metro

我正在开发一款地铁应用。我使用后台上传器上传文件,但我的问题是如何在上传后获得响应值。我这样编码:

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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)

答案 2 :(得分: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");
}

希望这会有所帮助。