上传速度问题:HttpWebRequest

本文关键字:HttpWebRequest 问题 速度 | 更新日期: 2023-09-27 17:49:34

我使用HttpWebRequest上传文件到某些服务器,现在的问题是我有速度问题。

我无法获得与浏览器(Mozilla Firefox)相同的上传速度,我获得的速度是浏览器速度的1/5。

这里是我的HttpWebRequest对象的设置
//headers is a NameValueCollection type object,
//Method is a struct { GET, POST, HEAD }
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.UserAgent = headers["User-Agent"];
        request.KeepAlive = false;
        request.Accept = headers["Accept"];
        request.AllowAutoRedirect = AllowRedirect;
        request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5");
        request.Method = Method.ToString();
        request.AllowWriteStreamBuffering = false;
        request.ReadWriteTimeout = 60000;

我保留的一些全局选项

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 200;
        ServicePointManager.MaxServicePointIdleTime = 2000;
        ServicePointManager.MaxServicePoints = 1000;
        ServicePointManager.SetTcpKeepAlive(false, 0, 0);

我是如何在块中发送文件的

            if (PostMethod == PostType.MultiPart && uploadFiles.Count > 0)
            {
                for (int i = 0; i < uploadFiles.Count; i++)
                {
                    string fileParam = uploadFiles.GetKey(i);
                    string tmpFilename = uploadFiles.Get(i);
                    string tmpData =
                    string.Format(
                        "--{0}'r'nContent-Disposition: form-data; name='"{1}'"; filename='"{2}'"'r'nContent-Type: {3}'r'n'r'n", boundary, fileParam, Path.GetFileName(tmpFilename), MimeType.GetMimeByExtension(Path.GetExtension(tmpFilename)));
                    byte[] tmpBytes = Encoding.Default.GetBytes(tmpData);
                    writer.Write(tmpBytes, 0, tmpBytes.Length);
                    bSent += tmpBytes.Length;
                    arg.Progress = (int)(bSent * 100 / totalBytes);
                    arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                    OnProgress(arg);
                    //write the file
                    int fileBytesRead;
                    FileStream fileStream = File.Open(tmpFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
// buffer size = 8192
                    while ((fileBytesRead = fileStream.Read(buffer, 0, BUFFER_SIZE)) > 0) 
                    {
                        writer.Write(buffer, 0, fileBytesRead);
                        bSent += fileBytesRead;
                        int timeNow = Environment.TickCount;
                        if (timeNow - lastTime >= 500)
                        {
                            lastTime = timeNow;
                            arg.Progress = (int)(bSent * 100 / totalBytes);
                            arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                            OnProgress(arg);
                        }
                    }
                    tmpBytes = Encoding.Default.GetBytes("'r'n");
                    writer.Write(tmpBytes, 0, tmpBytes.Length);
                    bSent += tmpBytes.Length;
                    arg.Progress = (int)(bSent * 100 / totalBytes);
                    arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                    OnProgress(arg);
                }
            }

我很高兴能达到75%的浏览器上传速度。

上传速度问题:HttpWebRequest

我通过搜索这个网站找到了答案。它似乎是"。. NET HttpWebRequest速度与浏览器".

从张贴在那里的答案:

"第一次请求页面时,.net尝试检测代理设置。解决方案是传入一个空的WebProxy对象。这样它就可以连接到远程服务器,而不是自动检测代理服务器。"- - - - - -马科斯

尝试添加

    request.Proxy = new WebProxy();

两件事

  1. 你通过分块破坏了TCP/IP堆栈的目的。TCP/IP设计用于处理近乎异步的数据传输。它将自己进行分块,并继续发送块,直到完成或达到未确认块的最大数量。如果达到最大数据块数,它将等待ACK(确认)继续(类似于信号量思想,期望释放可以"堆叠",也就是单个ACK包含它接收到的最后一个点,并且可以"释放"/确认多个数据块数据包)-或者请求超时。

    通过自己分块,每个块都必须被完全确认才能发送更多的数据,所以你增加了开销。您仍然使用相同的连接,但实际上发出多个单独的请求。此外,如果TCP/IP块大小不是您的块大小的除数(YOUR_CHUNK_SIZE % TCP_IP_CHUNK_SIZE != 0),您将留下一个延迟的TCP/IP块,它必须超时并解析为伪ACK;

  2. 2.

另一个对性能有影响的选项是使用UseNagleAlgorithm属性。当此属性设置为true时,TCP/IP将尝试对HTTP连接使用TCP内格尔算法。在发送TCP报文时,使用Nagle算法进行数据聚合。在数据通过网络发送之前,它将小消息序列累积成较大的TCP数据包。使用Nagle算法可以优化网络资源的使用,尽管在某些情况下性能也会降低。通常对于恒定的大容量吞吐量,使用Nagle算法可以实现性能改进。但是对于吞吐量较小的应用程序,可能会出现性能下降。

应用程序通常不需要更改的默认值UseNagleAlgorithm属性被设置为true。然而,如果……应用程序正在使用低延迟连接,设置它可能会有所帮助false.

From MSDN: HttpWebRequest Class (System.Net)

这里是我们可以用来提高上传速度的各种选项:-

http://bytes.com/topic/asp-net/answers/440179-how-speed-up-file-upload-2-0-a

在配置文件中使用这个大文件:——

写入web config system.web>

httpRuntime maxRequestLength="2097151"

这可能有助于在IIS 7.0中找到解决方案

写入web config system.web>httpModules

**add name="ITHitPutUploadProgressAndResumeModule" type="ITHit.WebDAV.Server.ResumableUpload.PutUploadProgressAndResumeModule, ITHit.WebDAV.Server"**