如何在ASP.NET Kestrel服务器中设置TCP待办事项

问题描述 投票:1回答:1

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 kestrel-http-server
1个回答
0
投票

由于当前的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[] { });
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.