我有一个使用Asp.Net Core的服务器,使用HTTPS时遇到了延迟问题。当仅获取少量图像时,每个请求需要大约20毫秒来处理。然而,当我同时进行125个请求时,使用HTTP时它们会变慢到30-80毫秒(可以接受),而使用HTTPS时则会变慢到130-850毫秒(不可接受)。
经过调试,发现延迟是在我的服务器向WMS服务器发起http调用时出现的。
添加自定义套接字处理程序将延迟从4000-6000毫秒降低到当前的130-850毫秒,这确实有所帮助,但延迟仍然有些大。
PS:服务器将执行比简单代理查询更多的操作,因此我不能简单地使用专用代理服务器来扮演该角色。
以下是服务器代码的最小示例:
经过调试,发现延迟是在我的服务器向WMS服务器发起http调用时出现的。
添加自定义套接字处理程序将延迟从4000-6000毫秒降低到当前的130-850毫秒,这确实有所帮助,但延迟仍然有些大。
PS:服务器将执行比简单代理查询更多的操作,因此我不能简单地使用专用代理服务器来扮演该角色。
以下是服务器代码的最小示例:
using System.Diagnostics.Tracing;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using var socketHandler = new SocketsHttpHandler()
{
PooledConnectionIdleTimeout = TimeSpan.FromMinutes(10),
PooledConnectionLifetime = TimeSpan.FromMinutes(10),
MaxConnectionsPerServer = 1,
};
using var httpClient = new HttpClient(socketHandler);
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSingleton(httpClient);
var app = builder.Build();
app.MapControllers();
app.Run();
[ApiController]
[Route("[controller]")]
public class WMSController : ControllerBase
{
private readonly HttpClient Client;
private readonly string BaseUrl;
public WMSController(HttpClient client)
{
Client = client;
BaseUrl = "http://my-local-hostname.company.internal:10301/WMS";
}
[HttpGet(Name = "WMS")]
public async Task<ActionResult> GetWms()
{
var query = HttpContext.Request.QueryString.Value;
var stopwatch = new Stopwatch();
stopwatch.Start();
var response = await Client.GetAsync(BaseUrl + query); // This is the slow part.
stopwatch.Stop();
Console.WriteLine($"{DateTime.Now:HH:mm:ss} - {stopwatch.ElapsedMilliseconds} - {HttpContext.Connection.Id}");
stopwatch.Reset();
var image = await response.Content.ReadAsByteArrayAsync();
return new FileContentResult(image, "image/jpeg");
}
}