2015-05-10 230 views
1

我正在使用這段代碼來執行一個簡單的REST請求。 (代碼主要來自這個q:How to post JSON to the server?)。爲什麼這個HttpWebRequest在C#中速度很慢

爲什麼這麼慢?我使用VS 2013,首次嘗試約需15秒,然後約4秒。在後續的嘗試中,但用另一種語言(德爾福),我可以發出http請求,並持續大約1秒。

 var request = (HttpWebRequest)WebRequest.Create("http://jsonplaceholder.typicode.com/posts"); 
     request.ContentType = "application/json"; 
     request.Method = "POST"; 
     request.ServicePoint.Expect100Continue = false; 

     using (var streamWriter = new StreamWriter(request.GetRequestStream())) 
     { 
      string json = new JavaScriptSerializer().Serialize(new 
      { 
       title = "foo", 
       body = "bar", 
       userId = "1" 
      }); 
      streamWriter.Write(json); 
     } 

     var response = (HttpWebResponse)request.GetResponse(); 
     using (var streamReader = new StreamReader(response.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
      textBox1.Text = result; 
     } 

P.S.你可以爲自己測試這個代碼,它只是使用上面url中的互聯網測試REST服務器。

+1

第一次嘗試是什麼意思?首先嚐試重新啓動後?首先嚐試當你的過程運行?或者是其他東西? –

+0

您是否每次發佈完全相同的東西?通常API的大多數延遲都在等待其他服務器,所以你自己的代碼幾乎沒有影響 – kyrenia

+0

@SriramSakthivel:是的,很好的問題:)。這意味着我離開電腦一段時間後的第一次嘗試。我沒有完全測量。也許幾分鐘。如果我在第一次嘗試後立即進行第二次嘗試,則需要大約4秒。所以這裏有兩個問題: 1)爲什麼在第一次嘗試和第二次嘗試之間存在這樣的差異,以及 2)與其他需要1秒的環境相比,爲什麼這麼慢(即4秒)。 – RaelB

回答

2

第一次嘗試是什麼意思?這意味着我離開電腦一段時間後的第一次嘗試

在到達服務器之前,有一個查找服務器的IP地址的過程。這個過程被稱爲Dns Resolution

第一次,您的應用程序必須經過Dns分辨率的過程才能找到IP地址。一旦你解決了IP地址,IP地址將被緩存在本地機器中。

所以,進一步調用並不經過的過程Dns Resolution;它可以使用緩存的IP。一段時間後,緩存將被丟棄,您將再次訪問DNS服務器以解析IP地址。

這是唯一的解釋,我可以提出你注意到的延遲。無論何時你注意到延遲,這可能意味着你正在碰到Dns服務器,只是因爲它是首次或緩存過期。

爲什麼在其他環境(德爾福)更快?

對不起,我不能拿出一個很好的理由。

+0

謝謝,這一定是它。我做了一些進一步的測試,這使得事情變得更加清楚:我把代碼放在一個循環中,看到第一次迭代是15s,但後面的所有迭代都是0.5s。所以代碼很好,只是第一次很慢。如果我在第一次之後第二次運行程序,那麼仍然有點奇怪,那麼第一次迭代就是3秒。它應該是15s(清除dns)或0.5s .... – RaelB

+0

@RelB這裏有多級緩存。一個使用本地機器,另一個使用路由器,Dns服務器本身維護緩存等。所以,可能會有一個或多個緩存過期,但其他一些緩存仍然有效。所以這可以回答你爲什麼看到3秒而不是15秒。我只是猜測;我可能是錯的。但是這可以給你更多的想法。 –

相關問題