2016-08-12 23 views
0

我有一個帶有POST方法的Web API控制器,如下所示。如何測試大塊物體是否被分塊?

public class MyController : ApiController 
{ 
    // POST: api/Scoring 
    public HttpResponseMessage Post([FromBody]ReallyLargeJSONObject request) 
    { 
     // some processing of this large json object 
     return Request.CreateResponse(HttpStatusCode.OK, someResponseObject); 
    } 
    .... 
} 

這是由了HTTPClient如下

HttpClient httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
httpClient.BaseAddress = new Uri("http://localhost"); 
ReallyLargeJSONObject request = new ReallyLargeJSONObject(); 
var task = httpClient.PostAsJsonAsync("api/my", request) 

我在,在.NET 4.5,HttpClient的類流中的數據(並沒有緩衝的話)少數地方讀取消耗。這很好,因爲這樣我的服務器不會被大數據包過載。不過,我想測試這個。爲此,我將來自客戶端的ReallyLargeJSONObject實例的大小設置爲〜20MB。我還嘗試使用大包(〜1GB)。當我使用fiddler時,它只顯示一個請求去服務器。我的問題:

  1. 我應該看到多個請求去服務器在提琴手?
  2. 如果在MyController.Post方法中設置了斷點,數據流式傳輸時它是否應該多次觸發?

回答

1

您不應該看到多個請求,也不應該多次命中Post方法,因爲它會在較低級別/方法調用中發生。

要真正看到碎塊並通過電線發送,您可以使用類似Wireshark的東西來監視網絡活動。有了這個,你就可以看到它是如何長時間服用,有多少包正在使用中,每個包有多大,等等

參考https://www.wireshark.org

閱讀流:Can you explain the concept of streams?

閱讀數據包:https://en.wikipedia.org/wiki/Packet_segmentation

+0

如果POST未被多次調用,數據分塊如何在引擎蓋下發生?數據被分塊併發送多次到服務器,對吧? –

+1

是的,它發生在HttpClient代碼中,如果它實際上是流式傳輸數據。在數據線上,數據將被分解成符合TCP的數據包。從本質上講,數據從一個大的部分分解成許多較小的部分並通過網絡發送,然後在接收端將它們拼湊在一起,看起來像是從代碼中最初發送的確實的大公園。 –

+1

@pauldeter我已經添加了一些額外資源,以更深入地瞭解這些網絡操作。如果你使用wireshark並觀察一下,你實際上可以看到你的數據被分成多少個數據包,以及一些有趣的底層操作。 –