0

我知道文档说什么,但我不知道 IServer 是从哪里引入的或如何配置的。

我的具体情况是我正在调用 IHostBuilder.ConfigureWebHost(而不是 ConfigureWebHostDefaults),尽我所能确定它不会自动包含 Kestrel。我通过 UseHttpSys 使用 HttpSys 而不是使用 Kestrel。

当我同时运行两个本地开发网站时遇到了一个问题。尽管 lauchSettings 文件的每个端口都有不同的端口,但它们都注册了端口 5000。当然,第二个站点收到了一个错误,表明 5000 已在使用中。经过一番摸索,我找到了文档表明端口 5000 是所有东西的默认值,而不仅仅是 Kestrel。(我真的相信在 5.0 之前,只有 Kestrel 默认为 5000。)我通过在我的代码中显式设置一个 URL 来证明默认值,并且它被兑现并且 5000 未被访问。然后,我删除了代码并在 appSettings 文件中设置了“urls”:“http://localhost:6000”,并且很荣幸。此时,我尝试将 true 和 false 作为 PreferHostingUrls 的参数,它们都使用 appSettings 文件中配置的 url,并且在 appSettings 或代码中没有明确的 url 时都失败了。

所以问题的一部分变成了什么是 IServer 以及它是如何引入和配置的。

4

1 回答 1

0

HostBuilder和IWebHostBuilder包含UseUrls方法,它是以分号分隔的 IP 地址或主机地址列表,其中包含服务器应侦听请求的端口和协议。通过使用这种方法,我们可以设置服务器应该监听请求的 URL,

此外,当我们配置 Asp.net 核心应用程序使用 Server(例如 Http.sys 或 Kestrel)时,在服务器选项中,我们还可以设置服务器应该监听请求的 URL,例如使用HttpSysOptions。 UrlPrefixes 属性KestrelServerOptions.Listen() 方法

然后,使用该PreferHostingUrls属性,我们可以指示主机是否应该侦听 IWebHostBuilder 上配置的 URL 或 IServer 上配置的 URL。

示例代码如下:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("hostsettings.json", optional: true)
            .AddCommandLine(args)
            .Build();

        return WebHost.CreateDefaultBuilder(args)
            .UseUrls("http://*:5000")
            .UseConfiguration(config)
            .UseHttpSys(serveroptions =>
            {
                serveroptions.Authentication.Schemes = Microsoft.AspNetCore.Server.HttpSys.AuthenticationSchemes.None;
                serveroptions.Authentication.AllowAnonymous = true;
                serveroptions.MaxConnections = 100;
                serveroptions.MaxRequestBodySize = 30000000;
                
                serveroptions.UrlPrefixes.Add("http://localhost:5001");
            })
            //.ConfigureKestrel(serverOptions =>
            //{                    
            //    serverOptions.Limits.MaxConcurrentConnections = 100;
            //    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
            //    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
            //    serverOptions.Limits.MinRequestBodyDataRate =
            //        new MinDataRate(bytesPerSecond: 100,
            //            gracePeriod: TimeSpan.FromSeconds(10));
            //    serverOptions.Limits.MinResponseDataRate =
            //        new MinDataRate(bytesPerSecond: 100,
            //            gracePeriod: TimeSpan.FromSeconds(10));
            //    serverOptions.Listen(IPAddress.Loopback, 5001);
            //    serverOptions.Limits.KeepAliveTimeout =
            //        TimeSpan.FromMinutes(2);
            //    serverOptions.Limits.RequestHeadersTimeout =
            //        TimeSpan.FromMinutes(1);
            //})
            .PreferHostingUrls(false)
            .Configure(app =>
            {
                app.Run(context =>
                    context.Response.WriteAsync("Hello, World!"));
            });
    }

如果PreferHostingUrlsfalse,则监听5001端口:

在此处输入图像描述

如果PreferHostingUrlstrue,它将监听5000端口:

在此处输入图像描述

参考:

如何使用 HTTP.sys

ASP.NET Core Web 主机:主机配置值

于 2020-11-16T08:59:01.260 回答