HttpClient传输速度慢

时间:2019-02-22 05:43:08

标签: c# asynchronous post httpclient bandwidth

我对HttpClient.PostAsync()命令或HttpSelfHostServer服务器的带宽感到困惑。尝试在本地网络上发布500MB的文件似乎很慢,但我不确定这是预期的行为还是应该做其他事情。所有的小请求都运行不到一秒钟,因此我暂时不打扰他们。

因此,要解决这个问题,我已经定时了两部分代码,发现这是我的瓶颈:

客户使用HttpClient.PostAsync()

private async Task<Stream> PostContentAsync(...)
{
    using (var formData = new MultipartFormDataContent())
    {
        // stream is a MemoryStream object with a Length of 524288000
        formData.Add(new StreamContent(stream), "file", fileName);
        formData.Add(new StringContent(DateTime.Now.ToString()), "UploadStart");
        var response = await client.PostAsync(uriEndpoint, formData);
HttpSelfHostServer上运行的

服务器控制器

[HttpPost]
public async Task<HttpResponseMessage> ProcessUpload(...)
{
    // record the time as soon as the request is received
    var BeginRequest = DateTime.Now;
    // custom parsing of form content
    var requestForm = await GetFormContentAsync(Request);
    var uploadStartString = await requestForm["UploadStart"]?.ToStringAsync() ?? "N/A";
    if (DateTime.TryParse(uploadStartString, out DateTime uploadStart))
    {
        var uploadTime = BeginRequest.Subtract(uploadStart);
        Console.WriteLine($"Client took {uploadTime.ToString("c")} to connect");
    }

关于输出,发布500MB文件时,我在服务器上看到这样的时间:

  

客户端花了00:00:49.7152052进行连接

是否只有大约10 MB / s的发布速度?所有这些通信都是在同一网络上的机器之间进行的,因此最大网络吞吐量应为1.25 GB / s(所有服务器/交换机之间的CAT-6电缆)。

我对本地测试没有更快感到惊讶(我在同一台计算机上同时运行服务器和客户端并获得了相同的结果)。 HttpClient.PostAsync()是否有数据传输限制?还是主机设置有问题?想知道我如何进一步诊断/是否有人曾遇到过此问题。在这两个事件之间应该发生什么事情我应该调查?

与此相关的最大问题是,作为数据处理的一部分,这些帖子只是许多服务器上500个不同的100+ GB文件的块,而每块〜50秒的时间花费了太多时间。如果某些终端服务器在同一台物理计算机上,则可以并行运行它们吗?我一直在尝试四处寻找有关这些极慢的传输速度的更多信息,但是我还没有发现任何可行的方法。

旁注-我尝试启用和禁用AutomaticDecompression,而UseProxy为假。 HttpClient仅创建一次,并在此过程中可用于所有客户发帖,并在完成后将其丢弃。


编辑:在服务器端为TransferMode = System.ServiceModel.TransferMode.Streamed;设置HttpSelfHostConfiguration似乎使我们度过了一个大的“等待”。现在,我有一个新的瓶颈,正在读取传入的流。读取本身似乎比可以达到的速度慢。以后会研究更多(可能更快)的方法来阅读表格。目前,这是受阻的:

private async Task<Dictionary<string, RequestData>> GetFormContentAsync(HttpRequestMessage request)
{
    try
    {
        var timer = new Stopwatch();
        timer.Start();
        Console.WriteLine($"- Reading content stream");
        var provider = await request.Content.ReadAsMultipartAsync();
        timer.Stop();
        Console.WriteLine($"- Took {timer.Elapsed.ToString("c")} to ReadAsMultipart");
  
      
  • 阅读内容流
  •   
  • 将00:00:25.4309885带到ReadAsMultipart
  •   

0 个答案:

没有答案