如何测试大对象是否被分块?

How to test if large objects are been chunked?

我有一个 Web API 控制器,其 POST 方法如下。

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 class 流式传输数据(并且不缓冲它)。这很好,因为这样我的服务器就不会因大数据包而超载。但是我想测试一下。为此,我将来自客户端的 ReallyLargeJSONObject 实例的大小设置为 ~20MB。我也尝试使用大数据包 (~1GB)。当我使用 fiddler 时,它只显示一个请求到服务器。我的问题:

  1. 我应该在 fiddler 中看到多个请求发送到服务器吗?
  2. 如果在MyController.Post方法中设置断点,在流数据时是否会多次命中?

您不应该看到多个请求,也不应该看到 Post 方法被多次命中,因为它会在较低的 level/method 调用中发生。

要真正看到块被分解并通过网络发送,您可以使用 Wireshark 之类的工具来监控网络 activity。有了它,您将能够看到它花费了多长时间,正在使用多少数据包,每个数据包有多大等。

参考https://www.wireshark.org

正在阅读流:Can you explain the concept of streams?

正在读取数据包:https://en.wikipedia.org/wiki/Packet_segmentation