ASP.NET Core v2.2。
var builder = WebHost.CreateDefaultBuilder()
.UseConfiguration(AppConfig.Root);
_host = builder.UseKestrel(options =>
{
options.AddServerHeader = false;
options.AllowSynchronousIO = false;
options.Limits.MinResponseDataRate = null;
options.Limits.MinRequestBodyDataRate = null;
options.ListenAnyIP(AppConfig.ClientApi.ListeningPort, (listenOptions) =>
{
listenOptions.NoDelay = true;
});
})
.UseStartup<ClientApiStartup>()
.Build();
问题:如何为Kestrel Web服务器配置TCP backlog?
我问这个问题是因为客户端在尝试连接到我的应用程序时,有时在高峰时段遇到错误。
由于目标机器主动拒绝,所以无法建立连接
[它偶尔仅在高峰时段发生(<0.1%),我想这是因为accept的TCP待办事项用尽了。
由于当前的ASP .NET Core版本(v3.0)对TCP积压进行了硬编码,因此我可以利用Easyhook解决此问题。
class WinsocksHook
{
/// <summary>
/// https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen
/// </summary>
/// <param name="backlog"></param>
/// <returns></returns>
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.I4)]
delegate int ListenDelegate(IntPtr socket, [MarshalAs(UnmanagedType.I4)] int backlog);
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryA", CharSet = CharSet.Ansi)]
static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("Ws2_32.dll", EntryPoint = "listen")]
static extern int Listen(IntPtr socket, uint uType);
static int SocketListen(IntPtr socket, int backlog)
{
return Listen(socket, 2048);
}
private static LocalHook _hook;
public static void Install()
{
LoadLibrary("Ws2_32.dll");
_hook = LocalHook.Create( LocalHook.GetProcAddress("Ws2_32.dll", "listen"), new ListenDelegate(SocketListen), null);
_hook.ThreadACL.SetExclusiveACL(new int[] { });
}
}