2016-08-12 45 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并观察一下,你实际上可以看到你的数据被分成多少个数据包,以及一些有趣的底层操作。 –