繁体   English   中英

C#HttpWebRequest块中的POST数据

[英]C# HttpWebRequest POST data in chunk

字节数组的最大长度是多少? 我正在尝试创建一个字节数组,其长度为551858003 我在大约526 MB的zip文件上创建了文件。 但这给了我错误Out of memory exception我正在将文件上传到google drive

在这里,我尝试了一些代码。 我正在使用以下代码读取zip文件的字节。

 byte[] FileByteArray = null;

                using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (storage.FileExists(fileName))
                    { 
                        using (IsolatedStorageFileStream fileStream = storage.OpenFile(fileName,FileMode.Open,FileAccess.Read))
                        {
                            fileStream.Flush();
                            fileStream.Position = 0;
                            long len = fileStream.Length;
                            FileByteArray = new byte[len];
                            fileStream.Read(FileByteArray, 0, FileByteArray.Length);

                            //using (BinaryReader binReader = new BinaryReader(fileStream))
                            //{
                            //    Int32 Filelength = Convert.ToInt32(fileStream.Length);
                            //    FileByteArray = binReader.ReadBytes(Filelength);
                            //}
                            fileStream.Flush();
                            fileStream.Dispose();
                            fileStream.Close();
                        }
                    }
                }

我该如何解决这个问题? 上传大文件时出现OutOfMemoryException 我可以上传约100MB。

这是我发送chunk图像的方法

 public void Images_ChunkRequst(string uploadURL, byte[] FileByteArray, int startIndex)
    {
        try
        {
            int chunkSize = 256 * 1024 * 2;
            int totalChunks = (int)Math.Ceiling((double)FileByteArray.Length / chunkSize);
            int endIndex = (int)(startIndex + chunkSize > FileByteArray.Length ? FileByteArray.Length : startIndex + chunkSize);
            int length = endIndex - startIndex;

            if (i < totalChunks)
            {
                 CollectionIP = CheckInternet.Find();
                if (CollectionIP.Count == 2 && DeviceNetworkInformation.IsWiFiEnabled)
                    NetworkIPaddress = IPAddress.Parse(CollectionIP[1]).ToString();
                else if (CollectionIP.Count > 0 && DeviceNetworkInformation.IsWiFiEnabled)
                    NetworkIPaddress = IPAddress.Parse(CollectionIP[0]).ToString();

                if (!string.IsNullOrEmpty(NetworkIPaddress))
                {
                    i = i + 1;
                    var request = WebRequest.Create(uploadURL) as HttpWebRequest;
                    request.Method = "PUT";
                    request.Headers["Authorization"] = string.Format("Bearer {0} ", AccessToken);
                    request.ContentType = "application/zip";
                    request.ContentLength = length;
                    request.Headers["Content-Range"] = "bytes " + startIndex + "-" + (endIndex - 1) + "/" + FileByteArray.Length;                        
                    request.AllowWriteStreamBuffering = false;

                    request.BeginGetRequestStream(arPut =>
                    {
                        var request1 = (HttpWebRequest)arPut.AsyncState;
                        using (var dataStream = request1.EndGetRequestStream(arPut))
                        {
                            //getting exception here
                            dataStream.Write(FileByteArray.Skip(startIndex).Take(endIndex).ToArray(), 0, FileByteArray.Take(length).Count());                                
                            dataStream.Flush();
                            dataStream.Dispose();
                            dataStream.Close();
                        }
                        request1.BeginGetResponse(aPut =>
                        {
                            var request2 = (HttpWebRequest)aPut.AsyncState;
                            WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
                            WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
                            var response = (HttpWebResponse)request2.EndGetResponse(aPut);

                            if (response.StatusCode.ToString() == "308") // Resume Incomplete
                            {
                                response.Dispose();
                                response.Close();

                                string packet = response.Headers["Range"];
                                string[] rng = packet.Remove(0, 6).Split('-');
                                Images_ChunkRequst(uploadURL, FileByteArray, Convert.ToInt32(rng[1]) + 1);
                            }
                            else if (response.StatusCode.ToString() == "500") //Internal Server Error
                            {
                                i = i - 1;
                                response.Dispose();
                                response.Close();
                                Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
                            }
                            else if (response.StatusCode.ToString() == "502") //Bad Gateway
                            {
                                i = i - 1;
                                response.Dispose();
                                response.Close();
                                Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
                            }
                            else if (response.StatusCode.ToString() == "503") //Service Unavailable
                            {
                                i = i - 1;
                                response.Dispose();
                                response.Close();
                                Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
                            }
                            else if (response.StatusCode.ToString() == "504") //Gateway Timeout
                            {
                                i = i - 1;

                                response.Dispose();
                                response.Close();
                                Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
                            }
                            else if (response.StatusCode == HttpStatusCode.NotFound) //Not Found
                            {
                                i = i - 1;

                                response.Dispose();
                                response.Close();
                                Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
                            }
                            else if (response.StatusCode == HttpStatusCode.OK) // upload complete.
                            {
                                Dispatcher.BeginInvoke(() =>
                                {
                                    i = 0;// i must be 0 after each upload success
                                    imgPass_Images.Visibility = Visibility.Visible;
                                    this.LayoutRoot.IsHitTestVisible = true;
                                    SystemTray.ProgressIndicator.IsIndeterminate = false;
                                    SystemTray.IsVisible = false;
                                    GetNextAutoOrder();
                                });
                            }
                        }, request1);
                    }, request);
                }
                else
                {
                    this.LayoutRoot.IsHitTestVisible = true;
                    SystemTray.ProgressIndicator.IsIndeterminate = false;
                    SystemTray.IsVisible = false;
                    MessageBox.Show("Please check your internet connection.");
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error occured. Trying to send failed package.");
            Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
        }
    }

我在这里遇到异常dataStream.Write(FileByteArray.Skip(startIndex).Take(endIndex).ToArray(), 0, FileByteArray.Take(length).Count()); 我已经尽力解决这个问题。 有人可以帮帮我吗? 我收到此异常Insufficient memory to continue the execution of the program

System.Array的当前实现将Int32用于其所有内部计数器等,因此,理论上最大的元素数是Int32.MaxValue 所以问题出在别的地方。

这与Array.Length 您的进程内存不足。 您应该分块进行分配。

这可能不是解决方案 ,但是您发布的代码存在一些问题:

                    using (IsolatedStorageFileStream fileStream = storage.OpenFile(fileName,FileMode.Open,FileAccess.Read))
                    {
                        fileStream.Flush();
                        fileStream.Position = 0;
                        long len = fileStream.Length;
                        FileByteArray = new byte[len];
                        fileStream.Read(FileByteArray, 0, FileByteArray.Length);

                        //using (BinaryReader binReader = new BinaryReader(fileStream))
                        //{
                        //    Int32 Filelength = Convert.ToInt32(fileStream.Length);
                        //    FileByteArray = binReader.ReadBytes(Filelength);
                        //}
                        fileStream.Flush();
                        fileStream.Dispose();
                        fileStream.Close();
                    }
  • fileStream.Flush()(如果强制将缓冲区写入磁盘)。 不需要阅读
  • fileStream.Close()将失败,因为在此之前调用了Dispose()
  • 不需要fileStream.Dispose()和fileStream.Close(),因为它应该由using()语句自动处理
  • fileStream.Read(array,start,lenght)返回实际读取的字节数的整数,因此它并不总是与实际长度匹配。 您应该继续阅读直到返回零。 这就是为什么我建议以下内容:

而不是按照流的大小创建FileByteArray,也可以在块中进行处理,然后将结果写入内存流中(或者,如果它也支持在块中进行发送,则最好将其直接发送到API。)因此,基本上:

创建一个类似1024的字节数组(如果要从缓冲区中读取更大的数据,可以更大-但要避免太大)

循环读取:

byte[] buffer = new byte[1024];
int read = 0;
while((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
     // write buffer[0:read] to memory location or temp file on disk (avoid Flushing for each write);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM