c# – HttpClient在上传前读取整个文件. UWP

前端之家收集整理的这篇文章主要介绍了c# – HttpClient在上传前读取整个文件. UWP前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个将文件上传到Facebook的UWP应用程序,我正在使用自定义的HttpContent来将文件上传到4k块,以最大限度地减少大文件(> 100mb)的内存使用情况并报告进度.

我的自定义HttpContent UploadWithProgressHttpContent:

  1. class UploadWithProgressHttpContent : HttpContent
  2. {
  3. private readonly IProgress<OperationProgress> _progress;
  4. private readonly OperationProgress _data;
  5. private readonly Stream _file;
  6. private readonly int _bufferSize;
  7. private readonly CancellationToken _token;
  8.  
  9. public UploadWithProgressHttpContent(
  10. IProgress<OperationProgress> progress,OperationProgress data,Stream file,int bufferSize,CancellationToken token)
  11. {
  12. _progress = progress;
  13. _data = data;
  14. _file = file;
  15. _bufferSize = bufferSize;
  16. _token = token;
  17. }
  18.  
  19.  
  20.  
  21. protected override Task SerializeToStreamAsync(Stream stream,TransportContext context)
  22. {
  23. return CopyStreamWithProgress(_file,stream,_progress,_token,_data,_bufferSize);
  24. }
  25.  
  26. public static async Task<Stream> CopyStreamWithProgress(
  27. Stream source,Stream destination,IProgress<OperationProgress> progress,CancellationToken token,OperationProgress progressData,int bufferSize
  28. )
  29. {
  30. int read,offset = 0;
  31. var buffer = new byte[bufferSize];
  32. using (source)
  33. {
  34. do
  35. {
  36. read = await source.ReadAsync(buffer,bufferSize,token);
  37.  
  38. await destination.WriteAsync(buffer,read,token);
  39.  
  40. offset += read;
  41. progressData.CurrentSize = offset;
  42. progress.Report(progressData);
  43. } while (read != 0);
  44. }
  45.  
  46. return destination;
  47. }
  48. }

我使用(使用fiddler)的是,在上传开始之前,整个文件被放入内存(我的进度计在上传甚至启动之前达到了100%).

我确实尝试将TransferEncodingChunked设置为true,并设置文件内容长度,但仍然存在问题.

上传源在PCL内(如果重要).我正在使用最新版本的System.Net.Http.如果需要我正在使用它与MediaFire SDK中使用的完全相同的方式

感谢任何帮助.

编辑:添加了HttpClient用法

  1. public async Task<T> Upload<T>(Stream fileStream,string fileName)
  2. {
  3. var handler = new HttpClientHandler();
  4.  
  5.  
  6. var cli = new HttpClient(handler);
  7.  
  8. foreach (var header in Headers)
  9. {
  10. cli.DefaultRequestHeaders.Add(header.Key,header.Value);
  11. }
  12.  
  13. var parameters = new MultipartFormDataContent();
  14. foreach (var parameter in Parameters)
  15. {
  16. parameters.Add(new StringContent(parameter.Value),parameter.Key);
  17. }
  18.  
  19. if (fileStream != null)
  20. {
  21. var fileContent = new UploadWithProgressHttpContent(ProgressOperation,ProgressData,fileStream,_chunkBufferSize,Token,fileStream.Length);
  22.  
  23. fileContent.Headers.ContentType = new MediaTypeHeaderValue(MimeTypeHelper.GetMimeType(fileName));
  24. fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue(StreamParamName);
  25. fileContent.Headers.ContentDisposition.FileName = fileName;
  26. fileContent.Headers.ContentLength = fileStream.Length;
  27. parameters.Add(fileContent,StreamParamName);
  28. }
  29.  
  30. var req = new HttpRequestMessage(method,Path) { Content = parameters };
  31. if (fileStream != null)
  32. req.Headers.TransferEncodingChunked = true;
  33.  
  34.  
  35. var completionOption = HttpCompletionOption.ResponseContentRead;
  36.  
  37.  
  38. var resp = await cli.SendAsync(req,completionOption,Token).ConfigureAwait(false);
  39.  
  40. return await DeserializeObject<T>(resp);
  41. }

解决方法

你有与量子力学相同的问题 – 观察观察变化的行为. Fiddler不支持请求流 – 请参阅
Fiddler makes HttpWebRequest/HttpClient behaviour unexpected

http://www.telerik.com/forums/is-it-possible-to-not-buffer-requests

使用wireshark我可以看到大块.

猜你在找的C#相关文章