手动(高级)设置
本页由英文自动翻译。 阅读原文
当需要自行组装服务器各部件时(例如一个进程必须暴露多个主机、端口、路由器或自定义服务器配置),请使用手动设置。对于大多数应用,构建器 API 更简洁且应当优先使用。手动设置在需要直接控制四个核心部件时非常有用:Router、一个或多个 ListeningHost 对象、HttpServerConfiguration,以及最终的 HttpServer。
首先,我们需要了解请求/响应的概念。它非常简单:每个请求必须有一个响应。Sisk 也遵循这一原则。让我们创建一个方法,以 HTML 返回 “Hello, World!” 消息,并指定状态码和头部。
// Program.cs
using Sisk.Core.Http;
using Sisk.Core.Routing;
static HttpResponse IndexPage(HttpRequest request)
{
HttpResponse indexResponse = new HttpResponse
{
Status = System.Net.HttpStatusCode.OK,
Content = new HtmlContent(@"
<html>
<body>
<h1>Hello, world!</h1>
</body>
</html>
")
};
return indexResponse;
}下一步是将此方法关联到一个 HTTP 路由。
路由器 #
路由器是请求路由的抽象,充当请求与响应之间的桥梁。路由器管理服务路由、函数和错误。
一个路由器可以拥有多条路由,每条路由可以在该路径上执行不同的操作,例如调用函数、提供页面或返回服务器资源。
让我们创建第一个路由器,并将 IndexPage 方法关联到根路径。
Router mainRouter = new Router();
mainRouter.MapGet("/", IndexPage);现在我们的路由器可以接收请求并发送响应。但 mainRouter 并未绑定到主机或服务器,单独使用时不会工作。接下来创建我们的 ListeningHost。
监听主机和端口 #
一个 ListeningHost 可以托管一个路由器,并为同一路由器提供多个监听端口。一个 ListeningPort 是 HTTP 服务器将监听的前缀。
这里,我们可以创建一个指向两个端点的 ListeningHost:
ListeningHost myHost = new ListeningHost
{
Router = mainRouter,
Ports = new ListeningPort[]
{
new ListeningPort("http://localhost:5000/")
}
};现在我们的 HTTP 服务器将监听指定的端点,并将请求转发给我们的路由器。
服务器配置 #
服务器配置负责大部分 HTTP 服务器本身的行为。在此配置中,我们可以将 ListeningHosts 与服务器关联。
HttpServerConfiguration config = new HttpServerConfiguration();
config.ListeningHosts.Add(myHost); // 将我们的 ListeningHost 添加到此服务器配置常用服务器配置选项:
| 属性 | 默认值 | 使用场景 | 备注 |
|---|---|---|---|
| RemoteRequestsAction | RequestListenAction.Accept | 服务应拒绝非本地请求,除非它们通过受信任的反向代理。 | 仅在部署拓扑明确时才将其设为 Drop。 |
| IncludeRequestIdHeader | false | 客户端或代理需要在 X-Request-Id 响应头中包含 Sisk 请求 ID。 | 请配合包含 HttpRequest.RequestId 的日志使用。 |
| IdleConnectionTimeout | 120 seconds | 空闲的 Keep-Alive 连接应在适当时机关闭。 | 此行为由 HTTP 引擎实现。 |
| NormalizeHeadersEncodings | false | 收到的头部存在编码不匹配。 | 此操作会增加处理开销,除非必要请保持禁用。 |
| SendSiskHeader | true | 您希望隐藏或显示 X-Powered-By Sisk 头部。 | 在更严格的生产环境头部策略下请禁用。 |
| OptionsLogMode | LogOutput.Both | 您希望减少或重定向自动 OPTIONS 处理产生的日志。 | 使用与路由相同的日志模式值。 |
| AsyncRequestProcessing | true | 您需要确定性的单请求处理以便诊断。 | 禁用后会限制吞吐量。 |
| DisposeDisposableContextValues | true | 实现 IDisposable 的请求袋值应自动释放。 | 除非在其他地方管理所有权,否则请保持启用。 |
| ConvertIAsyncEnumerableIntoEnumerable | true | 值处理程序应将异步可枚举对象作为阻塞的可枚举值接收。 | 如果您自行实现异步流处理,请禁用此功能。 |
| KeepAlive | true | 响应后连接应保持可复用。 | 对于不善于处理持久连接的客户端或中间件,请禁用。 |
| ForceTrailingSlash | false | GET 路由应重定向到带尾随斜杠的 URL。 | 仅适用于非正则表达式路由。 |
| MaximumContentLength | 100 MB | 请求体或 WebSocket 消息需要不同的大小限制。 | 在 Sisk 1.7 之前默认是 0(无限制)。将其设为 0 可移除限制。 |
| EnableAutomaticResponseCompression | false | 当客户端支持时,响应应自动压缩。 | 已有的 CompressedContent 响应不会再次压缩。 |
接下来,我们可以创建 HTTP 服务器:
HttpServer server = new HttpServer(config);
server.Start(); // 启动服务器
Console.ReadKey(); // 防止应用程序退出现在我们可以编译可执行文件,并使用以下命令运行 HTTP 服务器:
dotnet watch运行时,打开浏览器并访问服务器路径,你应该会看到:
