2013-02-14 85 views
0

我忙于一个必须将数据上传到网站的c#应用程序。我使用http post来上传数据,但对于我们的应用来说太慢了。上传少量数据需要大约1.5秒的时间。我尝试了两种不同的方法。c#发布http请求缓慢

方法1,使用的WebRequest:

WebRequest request = WebRequest.Create(packet.url.ToString()); 
       request.Method = "POST"; 
       request.Proxy = null; 
       byte[] byteArray = Encoding.UTF8.GetBytes(packet.postData); 
       request.ContentType = "application/x-www-form-urlencoded"; 
       request.ContentLength = byteArray.Length; 
       Stream dataStream = request.GetRequestStream(); 
       dataStream.Write(byteArray, 0, byteArray.Length); 
       dataStream.Close(); 
       WebResponse response = request.GetResponse(); 
       dataStream = response.GetResponseStream(); 
       StreamReader reader = new StreamReader(dataStream); 
       string responseFromServer = reader.ReadToEnd(); 
       reader.Close(); 
       dataStream.Close(); 
       response.Close(); 

Approach2,使用Web客户端:

string responseFromServer; 
       using (WebClient wc = new WebClient()) 
       { 
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
        responseFromServer = wc.UploadString(packet.url, packet.postData); 
       } 

这两个具有完全相同的延迟。我在JavaScript中测试了相同的东西。我使用xmlhttprequest将相同的数据发布到服务器,并且上传数据的时间少于0.5秒。请让我知道,如果有更快的方式在c#中做到这一点。

+0

C#和Javascript运行在同一台机器和网络环境中吗? – 2013-02-14 04:51:49

+0

你确定这不是服务器问题吗? – BrokenGlass 2013-02-14 04:51:52

+0

可能的DNS查找导致缓慢。 – leppie 2013-02-14 05:12:37

回答

0

第一次连接的尝试很慢,旁边的其他连接似乎很正常。

第一次尝试连接到主机,HttpWebRequest做了很多工作,它必须保持ConnectionPool并处理许多其他事情。 HttpWebRequest本身非常复杂。

如果只有第一个请求变慢,请不要担心。

现在,xmlhttprequest响应迅速,因为浏览器往往保持连接活跃的任何主机,支持它的公平份额时间。因此,反应更快!

+0

每次上传数据时,大约需要1.5到2秒才能上传数据,而不仅仅是第一次。每次我需要发送数据时,我都会创建一个新的WebRequest对象。有没有办法重用同一个对象,以便它维护一个ConnectionPool或自动发生?通过WebRequest使用HttpWebRequest是否有优势? – ControlYourWay 2013-02-15 03:38:41

+0

如果你需要更快的响应,试试'System.Net.Socket'我已经为自己写了一个包装,它非常快! – 2013-02-15 07:23:51

0

您应该设置Proxy = null,它会提高所有HTTP请求的总体速度。

+0

在方法1的第三行,我将Proxy设置为null。不幸的是,这并没有让它变得更快 – ControlYourWay 2013-02-15 03:43:01

0

您应该在一个请求中发送所有数据量,因为AppDeveloper表示webrequest需要大量时间进行初始化。我可以让你做这样的事情: 正如我认为你有一个 - 列表和每个单一的postData你做一个新的Web请求。所以你应该将整个List解析为JSON,然后通过WebRequest将完整的List发布到服务器。这将需要2秒,但您会在2秒内发送整个数据。

0

旧线程,但这可能适合你 - ServicePointManager.UseNagleAlgorithm = false;