上传速度问题: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%的浏览器上传速度。
我通过搜索这个网站找到了答案。它似乎是"。. NET HttpWebRequest速度与浏览器".
从张贴在那里的答案:
"第一次请求页面时,.net尝试检测代理设置。解决方案是传入一个空的WebProxy对象。这样它就可以连接到远程服务器,而不是自动检测代理服务器。"- - - - - -马科斯
尝试添加
request.Proxy = new WebProxy();
两件事
-
你通过分块破坏了TCP/IP堆栈的目的。TCP/IP设计用于处理近乎异步的数据传输。它将自己进行分块,并继续发送块,直到完成或达到未确认块的最大数量。如果达到最大数据块数,它将等待ACK(确认)继续(类似于信号量思想,期望释放可以"堆叠",也就是单个ACK包含它接收到的最后一个点,并且可以"释放"/确认多个数据块数据包)-或者请求超时。
通过自己分块,每个块都必须被完全确认才能发送更多的数据,所以你增加了开销。您仍然使用相同的连接,但实际上发出多个单独的请求。此外,如果TCP/IP块大小不是您的块大小的除数(YOUR_CHUNK_SIZE % TCP_IP_CHUNK_SIZE != 0),您将留下一个延迟的TCP/IP块,它必须超时并解析为伪ACK;
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"**