我对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